1c2aa98e2SPeter Wemmdivert(-1) 2c2aa98e2SPeter Wemm# 3d0cef73dSGregory Neil Shapiro# Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. 406f25ae9SGregory Neil Shapiro# All rights reserved. 5c2aa98e2SPeter Wemm# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. 6c2aa98e2SPeter Wemm# Copyright (c) 1988, 1993 7c2aa98e2SPeter Wemm# The Regents of the University of California. All rights reserved. 8c2aa98e2SPeter Wemm# 9c2aa98e2SPeter Wemm# By using this file, you agree to the terms and conditions set 10c2aa98e2SPeter Wemm# forth in the LICENSE file which can be found at the top level of 11c2aa98e2SPeter Wemm# the sendmail distribution. 12c2aa98e2SPeter Wemm# 13c2aa98e2SPeter Wemm# 14c2aa98e2SPeter Wemmdivert(0) 15c2aa98e2SPeter Wemm 16e3793f76SGregory Neil ShapiroVERSIONID(`$Id: proto.m4,v 8.734 2008/01/24 23:42:01 ca Exp $') 17c2aa98e2SPeter Wemm 1806f25ae9SGregory Neil Shapiro# level CF_LEVEL config file format 1906f25ae9SGregory Neil ShapiroV`'CF_LEVEL/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley') 20c2aa98e2SPeter Wemmdivert(-1) 21c2aa98e2SPeter Wemm 2240266059SGregory Neil Shapirodnl if MAILER(`local') not defined: do it ourself; be nice 2340266059SGregory Neil Shapirodnl maybe we should issue a warning? 2440266059SGregory Neil Shapiroifdef(`_MAILER_local_',`', `MAILER(local)') 2540266059SGregory Neil Shapiro 26c2aa98e2SPeter Wemm# do some sanity checking 27c2aa98e2SPeter Wemmifdef(`__OSTYPE__',, 2806f25ae9SGregory Neil Shapiro `errprint(`*** ERROR: No system type defined (use OSTYPE macro) 2906f25ae9SGregory Neil Shapiro')') 30c2aa98e2SPeter Wemm 31c2aa98e2SPeter Wemm# pick our default mailers 32c2aa98e2SPeter Wemmifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `esmtp')') 33c2aa98e2SPeter Wemmifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')') 34c2aa98e2SPeter Wemmifdef(`confRELAY_MAILER',, 35c2aa98e2SPeter Wemm `define(`confRELAY_MAILER', 36c2aa98e2SPeter Wemm `ifdef(`_MAILER_smtp_', `relay', 37c2aa98e2SPeter Wemm `ifdef(`_MAILER_uucp', `uucp-new', `unknown')')')') 38c2aa98e2SPeter Wemmifdef(`confUUCP_MAILER',, `define(`confUUCP_MAILER', `uucp-old')') 39c2aa98e2SPeter Wemmdefine(`_SMTP_', `confSMTP_MAILER')dnl for readability only 40c2aa98e2SPeter Wemmdefine(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only 41c2aa98e2SPeter Wemmdefine(`_RELAY_', `confRELAY_MAILER')dnl for readability only 42c2aa98e2SPeter Wemmdefine(`_UUCP_', `confUUCP_MAILER')dnl for readability only 43c2aa98e2SPeter Wemm 44c2aa98e2SPeter Wemm# back compatibility with old config files 45c2aa98e2SPeter Wemmifdef(`confDEF_GROUP_ID', 4606f25ae9SGregory Neil Shapiro`errprint(`*** confDEF_GROUP_ID is obsolete. 4706f25ae9SGregory Neil Shapiro Use confDEF_USER_ID with a colon in the value instead. 4806f25ae9SGregory Neil Shapiro')') 49c2aa98e2SPeter Wemmifdef(`confREAD_TIMEOUT', 5006f25ae9SGregory Neil Shapiro`errprint(`*** confREAD_TIMEOUT is obsolete. 5106f25ae9SGregory Neil Shapiro Use individual confTO_<timeout> parameters instead. 5206f25ae9SGregory Neil Shapiro')') 53c2aa98e2SPeter Wemmifdef(`confMESSAGE_TIMEOUT', 54c2aa98e2SPeter Wemm `define(`_ARG_', index(confMESSAGE_TIMEOUT, /)) 55c2aa98e2SPeter Wemm ifelse(_ARG_, -1, 56c2aa98e2SPeter Wemm `define(`confTO_QUEUERETURN', confMESSAGE_TIMEOUT)', 57c2aa98e2SPeter Wemm `define(`confTO_QUEUERETURN', 58c2aa98e2SPeter Wemm substr(confMESSAGE_TIMEOUT, 0, _ARG_)) 59c2aa98e2SPeter Wemm define(`confTO_QUEUEWARN', 60c2aa98e2SPeter Wemm substr(confMESSAGE_TIMEOUT, eval(_ARG_+1)))')') 61c2aa98e2SPeter Wemmifdef(`confMIN_FREE_BLOCKS', `ifelse(index(confMIN_FREE_BLOCKS, /), -1,, 6206f25ae9SGregory Neil Shapiro`errprint(`*** compound confMIN_FREE_BLOCKS is obsolete. 6306f25ae9SGregory Neil Shapiro Use confMAX_MESSAGE_SIZE for the second part of the value. 6406f25ae9SGregory Neil Shapiro')')') 6506f25ae9SGregory Neil Shapiro 6606f25ae9SGregory Neil Shapiro 6706f25ae9SGregory Neil Shapiro# Sanity check on ldap_routing feature 6806f25ae9SGregory Neil Shapiro# If the user doesn't specify a new map, they better have given as a 6906f25ae9SGregory Neil Shapiro# default LDAP specification which has the LDAP base (and most likely the host) 7006f25ae9SGregory Neil Shapiroifdef(`confLDAP_DEFAULT_SPEC',, `ifdef(`_LDAP_ROUTING_WARN_', `errprint(` 7106f25ae9SGregory Neil ShapiroWARNING: Using default FEATURE(ldap_routing) map definition(s) 7206f25ae9SGregory Neil Shapirowithout setting confLDAP_DEFAULT_SPEC option. 7306f25ae9SGregory Neil Shapiro')')')dnl 74c2aa98e2SPeter Wemm 75c2aa98e2SPeter Wemm# clean option definitions below.... 7606f25ae9SGregory Neil Shapirodefine(`_OPTION', `ifdef(`$2', `O $1`'ifelse(defn(`$2'), `',, `=$2')', `#O $1`'ifelse(`$3', `',,`=$3')')')dnl 77c2aa98e2SPeter Wemm 7806f25ae9SGregory Neil Shapirodnl required to "rename" the check_* rulesets... 7906f25ae9SGregory Neil Shapirodefine(`_U_',ifdef(`_DELAY_CHECKS_',`',`_')) 8006f25ae9SGregory Neil Shapirodnl default relaying denied message 8140266059SGregory Neil Shapiroifdef(`confRELAY_MSG', `', `define(`confRELAY_MSG', 8240266059SGregory Neil Shapiroifdef(`_USE_AUTH_', `"550 Relaying denied. Proper authentication required."', `"550 Relaying denied"'))') 8340266059SGregory Neil Shapiroifdef(`confRCPTREJ_MSG', `', `define(`confRCPTREJ_MSG', `"550 Mailbox disabled for this recipient"')') 8440266059SGregory Neil Shapirodefine(`_CODE553', `553') 85c2aa98e2SPeter Wemmdivert(0)dnl 86c2aa98e2SPeter Wemm 8706f25ae9SGregory Neil Shapiro# override file safeties - setting this option compromises system security, 8806f25ae9SGregory Neil Shapiro# addressing the actual file configuration problem is preferred 8906f25ae9SGregory Neil Shapiro# need to set this before any file actions are encountered in the cf file 9006f25ae9SGregory Neil Shapiro_OPTION(DontBlameSendmail, `confDONT_BLAME_SENDMAIL', `safe') 9106f25ae9SGregory Neil Shapiro 9206f25ae9SGregory Neil Shapiro# default LDAP map specification 9306f25ae9SGregory Neil Shapiro# need to set this now before any LDAP maps are defined 9406f25ae9SGregory Neil Shapiro_OPTION(LDAPDefaultSpec, `confLDAP_DEFAULT_SPEC', `-h localhost') 95c2aa98e2SPeter Wemm 96c2aa98e2SPeter Wemm################## 97c2aa98e2SPeter Wemm# local info # 98c2aa98e2SPeter Wemm################## 99c2aa98e2SPeter Wemm 10040266059SGregory Neil Shapiro# my LDAP cluster 10140266059SGregory Neil Shapiro# need to set this before any LDAP lookups are done (including classes) 10240266059SGregory Neil Shapiroifdef(`confLDAP_CLUSTER', `D{sendmailMTACluster}`'confLDAP_CLUSTER', `#D{sendmailMTACluster}$m') 10340266059SGregory Neil Shapiro 104c2aa98e2SPeter WemmCwlocalhost 105c2aa98e2SPeter Wemmifdef(`USE_CW_FILE', 106c2aa98e2SPeter Wemm`# file containing names of hosts for which we receive email 107c2aa98e2SPeter WemmFw`'confCW_FILE', 108c2aa98e2SPeter Wemm `dnl') 109c2aa98e2SPeter Wemm 110c2aa98e2SPeter Wemm# my official domain name 111c2aa98e2SPeter Wemm# ... `define' this only if sendmail cannot automatically determine your domain 112c2aa98e2SPeter Wemmifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') 113c2aa98e2SPeter Wemm 114323f6dcbSGregory Neil Shapiro# host/domain names ending with a token in class P are canonical 115c2aa98e2SPeter WemmCP. 116c2aa98e2SPeter Wemm 117c2aa98e2SPeter Wemmifdef(`UUCP_RELAY', 118c2aa98e2SPeter Wemm`# UUCP relay host 119c2aa98e2SPeter WemmDY`'UUCP_RELAY 120c2aa98e2SPeter WemmCPUUCP 121c2aa98e2SPeter Wemm 122c2aa98e2SPeter Wemm')dnl 123c2aa98e2SPeter Wemmifdef(`BITNET_RELAY', 124c2aa98e2SPeter Wemm`# BITNET relay host 125c2aa98e2SPeter WemmDB`'BITNET_RELAY 126c2aa98e2SPeter WemmCPBITNET 127c2aa98e2SPeter Wemm 128c2aa98e2SPeter Wemm')dnl 129c2aa98e2SPeter Wemmifdef(`DECNET_RELAY', 130c2aa98e2SPeter Wemm`define(`_USE_DECNET_SYNTAX_', 1)dnl 131c2aa98e2SPeter Wemm# DECnet relay host 132c2aa98e2SPeter WemmDC`'DECNET_RELAY 133c2aa98e2SPeter WemmCPDECNET 134c2aa98e2SPeter Wemm 135c2aa98e2SPeter Wemm')dnl 136c2aa98e2SPeter Wemmifdef(`FAX_RELAY', 137c2aa98e2SPeter Wemm`# FAX relay host 138c2aa98e2SPeter WemmDF`'FAX_RELAY 139c2aa98e2SPeter WemmCPFAX 140c2aa98e2SPeter Wemm 141c2aa98e2SPeter Wemm')dnl 142c2aa98e2SPeter Wemm# "Smart" relay host (may be null) 14340266059SGregory Neil ShapiroDS`'ifdef(`SMART_HOST', `SMART_HOST') 144c2aa98e2SPeter Wemm 145c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl 146c2aa98e2SPeter Wemm# place to which unknown users should be forwarded 147c2aa98e2SPeter WemmKuser user -m -a<> 148c2aa98e2SPeter WemmDL`'LUSER_RELAY', 149c2aa98e2SPeter Wemm`dnl') 150c2aa98e2SPeter Wemm 151c2aa98e2SPeter Wemm# operators that cannot be in local usernames (i.e., network indicators) 152c2aa98e2SPeter WemmCO @ % ifdef(`_NO_UUCP_', `', `!') 153c2aa98e2SPeter Wemm 154c2aa98e2SPeter Wemm# a class with just dot (for identifying canonical names) 155c2aa98e2SPeter WemmC.. 156c2aa98e2SPeter Wemm 157c2aa98e2SPeter Wemm# a class with just a left bracket (for identifying domain literals) 158c2aa98e2SPeter WemmC[[ 159c2aa98e2SPeter Wemm 16006f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 16106f25ae9SGregory Neil Shapiro# access_db acceptance class 16206f25ae9SGregory Neil ShapiroC{Accept}OK RELAY 16340266059SGregory Neil Shapiroifdef(`_DELAY_COMPAT_8_10_',`dnl 16406f25ae9SGregory Neil Shapiroifdef(`_BLACKLIST_RCPT_',`dnl 16506f25ae9SGregory Neil Shapiro# possible access_db RHS for spam friends/haters 16606f25ae9SGregory Neil ShapiroC{SpamTag}SPAMFRIEND SPAMHATER')')', 167c2aa98e2SPeter Wemm`dnl') 168c2aa98e2SPeter Wemm 16940266059SGregory Neil Shapirodnl mark for "domain is ok" (resolved or accepted anyway) 17040266059SGregory Neil Shapirodefine(`_RES_OK_', `OKR')dnl 171c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_',`dnl',`dnl 172c2aa98e2SPeter Wemm# Resolve map (to check if a host exists in check_mail) 17340266059SGregory Neil ShapiroKresolve host -a<_RES_OK_> -T<TEMP>') 17440266059SGregory Neil ShapiroC{ResOk}_RES_OK_ 175c2aa98e2SPeter Wemm 17613058a91SGregory Neil Shapiroifdef(`_NEED_MACRO_MAP_', `dnl 17713058a91SGregory Neil Shapiroifdef(`_MACRO_MAP_', `', `# macro storage map 17813058a91SGregory Neil Shapirodefine(`_MACRO_MAP_', `1')dnl 17913058a91SGregory Neil ShapiroKmacro macro')', `dnl') 18042e5d165SGregory Neil Shapiro 181c2aa98e2SPeter Wemmifdef(`confCR_FILE', `dnl 18242e5d165SGregory Neil Shapiro# Hosts for which relaying is permitted ($=R) 183c2aa98e2SPeter WemmFR`'confCR_FILE', 184c2aa98e2SPeter Wemm`dnl') 185c2aa98e2SPeter Wemm 18640266059SGregory Neil Shapirodefine(`TLS_SRV_TAG', `"TLS_Srv"')dnl 18740266059SGregory Neil Shapirodefine(`TLS_CLT_TAG', `"TLS_Clt"')dnl 18840266059SGregory Neil Shapirodefine(`TLS_RCPT_TAG', `"TLS_Rcpt"')dnl 18940266059SGregory Neil Shapirodefine(`TLS_TRY_TAG', `"Try_TLS"')dnl 19040266059SGregory Neil Shapirodefine(`SRV_FEAT_TAG', `"Srv_Features"')dnl 19106f25ae9SGregory Neil Shapirodnl this may be useful in other contexts too 19206f25ae9SGregory Neil Shapiroifdef(`_ARITH_MAP_', `', `# arithmetic map 19306f25ae9SGregory Neil Shapirodefine(`_ARITH_MAP_', `1')dnl 19406f25ae9SGregory Neil ShapiroKarith arith') 19506f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 19640266059SGregory Neil Shapiroifdef(`_MACRO_MAP_', `', `# macro storage map 19740266059SGregory Neil Shapirodefine(`_MACRO_MAP_', `1')dnl 19840266059SGregory Neil ShapiroKmacro macro') 19940266059SGregory Neil Shapiro# possible values for TLS_connection in access map 200e92d3f3fSGregory Neil ShapiroC{Tls}VERIFY ENCR', `dnl') 20106f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_ISSUER_', `dnl 20206f25ae9SGregory Neil Shapiro# extract relevant part from cert issuer 20306f25ae9SGregory Neil ShapiroKCERTIssuer regex _CERT_REGEX_ISSUER_', `dnl') 20406f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_SUBJECT_', `dnl 20506f25ae9SGregory Neil Shapiro# extract relevant part from cert subject 20606f25ae9SGregory Neil ShapiroKCERTSubject regex _CERT_REGEX_SUBJECT_', `dnl') 20706f25ae9SGregory Neil Shapiro 20840266059SGregory Neil Shapiroifdef(`LOCAL_RELAY', `dnl 209fabecb74SGregory Neil Shapiro# who I send unqualified names to if `FEATURE(stickyhost)' is used 21013bd1963SGregory Neil Shapiro# (null means deliver locally) 21140266059SGregory Neil ShapiroDR`'LOCAL_RELAY') 212c2aa98e2SPeter Wemm 21340266059SGregory Neil Shapiroifdef(`MAIL_HUB', `dnl 21413bd1963SGregory Neil Shapiro# who gets all local email traffic 215fabecb74SGregory Neil Shapiro# ($R has precedence for unqualified names if `FEATURE(stickyhost)' is used) 21640266059SGregory Neil ShapiroDH`'MAIL_HUB') 217c2aa98e2SPeter Wemm 218c2aa98e2SPeter Wemm# dequoting map 21940266059SGregory Neil ShapiroKdequote dequote`'ifdef(`confDEQUOTE_OPTS', ` confDEQUOTE_OPTS', `') 220c2aa98e2SPeter Wemm 221c2aa98e2SPeter Wemmdivert(0)dnl # end of nullclient diversion 222c2aa98e2SPeter Wemm# class E: names that should be exposed as from this host, even if we masquerade 22306f25ae9SGregory Neil Shapiro# class L: names that should be delivered locally, even if we have a relay 224c2aa98e2SPeter Wemm# class M: domains that should be converted to $M 22506f25ae9SGregory Neil Shapiro# class N: domains that should not be converted to $M 226c2aa98e2SPeter Wemm#CL root 227c2aa98e2SPeter Wemmundivert(5)dnl 22806f25ae9SGregory Neil Shapiroifdef(`_VIRTHOSTS_', `CR$={VirtHost}', `dnl') 229c2aa98e2SPeter Wemm 23040266059SGregory Neil Shapiroifdef(`MASQUERADE_NAME', `dnl 231c2aa98e2SPeter Wemm# who I masquerade as (null for no masquerading) (see also $=M) 23240266059SGregory Neil ShapiroDM`'MASQUERADE_NAME') 233c2aa98e2SPeter Wemm 234c2aa98e2SPeter Wemm# my name for error messages 235c2aa98e2SPeter Wemmifdef(`confMAILER_NAME', `Dn`'confMAILER_NAME', `#DnMAILER-DAEMON') 236c2aa98e2SPeter Wemm 23706f25ae9SGregory Neil Shapiroundivert(6)dnl LOCAL_CONFIG 238c2aa98e2SPeter Wemminclude(_CF_DIR_`m4/version.m4') 239c2aa98e2SPeter Wemm 240c2aa98e2SPeter Wemm############### 241c2aa98e2SPeter Wemm# Options # 242c2aa98e2SPeter Wemm############### 24340266059SGregory Neil Shapiroifdef(`confAUTO_REBUILD', 24440266059SGregory Neil Shapiro`errprint(WARNING: `confAUTO_REBUILD' is no longer valid. 24540266059SGregory Neil Shapiro There was a potential for a denial of service attack if this is set. 24640266059SGregory Neil Shapiro)')dnl 247c2aa98e2SPeter Wemm 248c2aa98e2SPeter Wemm# strip message body to 7 bits on input? 24906f25ae9SGregory Neil Shapiro_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT', `False') 250c2aa98e2SPeter Wemm 251c2aa98e2SPeter Wemm# 8-bit data handling 2528774250cSGregory Neil Shapiro_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', `pass8') 253c2aa98e2SPeter Wemm 254c2aa98e2SPeter Wemm# wait for alias file rebuild (default units: minutes) 25506f25ae9SGregory Neil Shapiro_OPTION(AliasWait, `confALIAS_WAIT', `5m') 256c2aa98e2SPeter Wemm 257c2aa98e2SPeter Wemm# location of alias file 25806f25ae9SGregory Neil Shapiro_OPTION(AliasFile, `ALIAS_FILE', `MAIL_SETTINGS_DIR`'aliases') 25906f25ae9SGregory Neil Shapiro 260c2aa98e2SPeter Wemm# minimum number of free blocks on filesystem 26106f25ae9SGregory Neil Shapiro_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', `100') 262c2aa98e2SPeter Wemm 263c2aa98e2SPeter Wemm# maximum message size 264e92d3f3fSGregory Neil Shapiro_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', `0') 265c2aa98e2SPeter Wemm 266c2aa98e2SPeter Wemm# substitution for space (blank) characters 26706f25ae9SGregory Neil Shapiro_OPTION(BlankSub, `confBLANK_SUB', `_') 268c2aa98e2SPeter Wemm 269c2aa98e2SPeter Wemm# avoid connecting to "expensive" mailers on initial submission? 27006f25ae9SGregory Neil Shapiro_OPTION(HoldExpensive, `confCON_EXPENSIVE', `False') 271c2aa98e2SPeter Wemm 272c2aa98e2SPeter Wemm# checkpoint queue runs after every N successful deliveries 27306f25ae9SGregory Neil Shapiro_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', `10') 274c2aa98e2SPeter Wemm 275c2aa98e2SPeter Wemm# default delivery mode 27606f25ae9SGregory Neil Shapiro_OPTION(DeliveryMode, `confDELIVERY_MODE', `background') 277c2aa98e2SPeter Wemm 278c2aa98e2SPeter Wemm# error message header/file 27906f25ae9SGregory Neil Shapiro_OPTION(ErrorHeader, `confERROR_MESSAGE', `MAIL_SETTINGS_DIR`'error-header') 280c2aa98e2SPeter Wemm 281c2aa98e2SPeter Wemm# error mode 28206f25ae9SGregory Neil Shapiro_OPTION(ErrorMode, `confERROR_MODE', `print') 283c2aa98e2SPeter Wemm 284c2aa98e2SPeter Wemm# save Unix-style "From_" lines at top of header? 28506f25ae9SGregory Neil Shapiro_OPTION(SaveFromLine, `confSAVE_FROM_LINES', `False') 286c2aa98e2SPeter Wemm 28740266059SGregory Neil Shapiro# queue file mode (qf files) 28840266059SGregory Neil Shapiro_OPTION(QueueFileMode, `confQUEUE_FILE_MODE', `0600') 28940266059SGregory Neil Shapiro 290c2aa98e2SPeter Wemm# temporary file mode 29106f25ae9SGregory Neil Shapiro_OPTION(TempFileMode, `confTEMP_FILE_MODE', `0600') 292c2aa98e2SPeter Wemm 293c2aa98e2SPeter Wemm# match recipients against GECOS field? 29406f25ae9SGregory Neil Shapiro_OPTION(MatchGECOS, `confMATCH_GECOS', `False') 295c2aa98e2SPeter Wemm 296c2aa98e2SPeter Wemm# maximum hop count 29740266059SGregory Neil Shapiro_OPTION(MaxHopCount, `confMAX_HOP', `25') 298c2aa98e2SPeter Wemm 299c2aa98e2SPeter Wemm# location of help file 30006f25ae9SGregory Neil ShapiroO HelpFile=ifdef(`HELP_FILE', HELP_FILE, `MAIL_SETTINGS_DIR`'helpfile') 301c2aa98e2SPeter Wemm 302c2aa98e2SPeter Wemm# ignore dots as terminators in incoming messages? 30306f25ae9SGregory Neil Shapiro_OPTION(IgnoreDots, `confIGNORE_DOTS', `False') 304c2aa98e2SPeter Wemm 305c2aa98e2SPeter Wemm# name resolver options 30606f25ae9SGregory Neil Shapiro_OPTION(ResolverOptions, `confBIND_OPTS', `+AAONLY') 307c2aa98e2SPeter Wemm 308c2aa98e2SPeter Wemm# deliver MIME-encapsulated error messages? 30906f25ae9SGregory Neil Shapiro_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS', `True') 310c2aa98e2SPeter Wemm 311c2aa98e2SPeter Wemm# Forward file search path 31206f25ae9SGregory Neil Shapiro_OPTION(ForwardPath, `confFORWARD_PATH', `/var/forward/$u:$z/.forward.$w:$z/.forward') 313c2aa98e2SPeter Wemm 314c2aa98e2SPeter Wemm# open connection cache size 31506f25ae9SGregory Neil Shapiro_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', `2') 316c2aa98e2SPeter Wemm 317c2aa98e2SPeter Wemm# open connection cache timeout 31806f25ae9SGregory Neil Shapiro_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', `5m') 319c2aa98e2SPeter Wemm 320c2aa98e2SPeter Wemm# persistent host status directory 32106f25ae9SGregory Neil Shapiro_OPTION(HostStatusDirectory, `confHOST_STATUS_DIRECTORY', `.hoststat') 322c2aa98e2SPeter Wemm 323c2aa98e2SPeter Wemm# single thread deliveries (requires HostStatusDirectory)? 32406f25ae9SGregory Neil Shapiro_OPTION(SingleThreadDelivery, `confSINGLE_THREAD_DELIVERY', `False') 325c2aa98e2SPeter Wemm 326c2aa98e2SPeter Wemm# use Errors-To: header? 32706f25ae9SGregory Neil Shapiro_OPTION(UseErrorsTo, `confUSE_ERRORS_TO', `False') 328c2aa98e2SPeter Wemm 329c2aa98e2SPeter Wemm# log level 33006f25ae9SGregory Neil Shapiro_OPTION(LogLevel, `confLOG_LEVEL', `10') 331c2aa98e2SPeter Wemm 332c2aa98e2SPeter Wemm# send to me too, even in an alias expansion? 33306f25ae9SGregory Neil Shapiro_OPTION(MeToo, `confME_TOO', `True') 334c2aa98e2SPeter Wemm 335c2aa98e2SPeter Wemm# verify RHS in newaliases? 33606f25ae9SGregory Neil Shapiro_OPTION(CheckAliases, `confCHECK_ALIASES', `False') 337c2aa98e2SPeter Wemm 338c2aa98e2SPeter Wemm# default messages to old style headers if no special punctuation? 33906f25ae9SGregory Neil Shapiro_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS', `False') 340c2aa98e2SPeter Wemm 341c2aa98e2SPeter Wemm# SMTP daemon options 34206f25ae9SGregory Neil Shapiroifelse(defn(`confDAEMON_OPTIONS'), `', `dnl', 343605302a5SGregory Neil Shapiro`errprint(WARNING: `confDAEMON_OPTIONS' is no longer valid. 344605302a5SGregory Neil Shapiro Use `DAEMON_OPTIONS()'; see cf/README. 34506f25ae9SGregory Neil Shapiro)'dnl 34606f25ae9SGregory Neil Shapiro`DAEMON_OPTIONS(`confDAEMON_OPTIONS')') 34742e5d165SGregory Neil Shapiroifelse(defn(`_DPO_'), `', 34840266059SGregory Neil Shapiro`ifdef(`_NETINET6_', `O DaemonPortOptions=Name=MTA-v4, Family=inet 34940266059SGregory Neil ShapiroO DaemonPortOptions=Name=MTA-v6, Family=inet6',`O DaemonPortOptions=Name=MTA')', `_DPO_') 35006f25ae9SGregory Neil Shapiroifdef(`_NO_MSA_', `dnl', `O DaemonPortOptions=Port=587, Name=MSA, M=E') 35106f25ae9SGregory Neil Shapiro 35206f25ae9SGregory Neil Shapiro# SMTP client options 35340266059SGregory Neil Shapiroifelse(defn(`confCLIENT_OPTIONS'), `', `dnl', 35440266059SGregory Neil Shapiro`errprint(WARNING: `confCLIENT_OPTIONS' is no longer valid. See cf/README for more information. 35540266059SGregory Neil Shapiro)'dnl 35640266059SGregory Neil Shapiro`CLIENT_OPTIONS(`confCLIENT_OPTIONS')') 35740266059SGregory Neil Shapiroifelse(defn(`_CPO_'), `', 35840266059SGregory Neil Shapiro`#O ClientPortOptions=Family=inet, Address=0.0.0.0', `_CPO_') 35940266059SGregory Neil Shapiro 36040266059SGregory Neil Shapiro# Modifiers to `define' {daemon_flags} for direct submissions 36140266059SGregory Neil Shapiro_OPTION(DirectSubmissionModifiers, `confDIRECT_SUBMISSION_MODIFIERS', `') 36240266059SGregory Neil Shapiro 36340266059SGregory Neil Shapiro# Use as mail submission program? See sendmail/SECURITY 36440266059SGregory Neil Shapiro_OPTION(UseMSP, `confUSE_MSP', `') 365c2aa98e2SPeter Wemm 366c2aa98e2SPeter Wemm# privacy flags 36706f25ae9SGregory Neil Shapiro_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', `authwarnings') 368c2aa98e2SPeter Wemm 369c2aa98e2SPeter Wemm# who (if anyone) should get extra copies of error messages 37006f25ae9SGregory Neil Shapiro_OPTION(PostmasterCopy, `confCOPY_ERRORS_TO', `Postmaster') 371c2aa98e2SPeter Wemm 372c2aa98e2SPeter Wemm# slope of queue-only function 37306f25ae9SGregory Neil Shapiro_OPTION(QueueFactor, `confQUEUE_FACTOR', `600000') 374c2aa98e2SPeter Wemm 37540266059SGregory Neil Shapiro# limit on number of concurrent queue runners 37640266059SGregory Neil Shapiro_OPTION(MaxQueueChildren, `confMAX_QUEUE_CHILDREN', `') 37740266059SGregory Neil Shapiro 37840266059SGregory Neil Shapiro# maximum number of queue-runners per queue-grouping with multiple queues 37940266059SGregory Neil Shapiro_OPTION(MaxRunnersPerQueue, `confMAX_RUNNERS_PER_QUEUE', `1') 38040266059SGregory Neil Shapiro 38140266059SGregory Neil Shapiro# priority of queue runners (nice(3)) 38240266059SGregory Neil Shapiro_OPTION(NiceQueueRun, `confNICE_QUEUE_RUN', `') 38340266059SGregory Neil Shapiro 38440266059SGregory Neil Shapiro# shall we sort the queue by hostname first? 38540266059SGregory Neil Shapiro_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', `priority') 38640266059SGregory Neil Shapiro 38740266059SGregory Neil Shapiro# minimum time in queue before retry 38840266059SGregory Neil Shapiro_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', `30m') 38940266059SGregory Neil Shapiro 39040266059SGregory Neil Shapiro# how many jobs can you process in the queue? 3914e4196cbSGregory Neil Shapiro_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', `0') 39240266059SGregory Neil Shapiro 39340266059SGregory Neil Shapiro# perform initial split of envelope without checking MX records 39440266059SGregory Neil Shapiro_OPTION(FastSplit, `confFAST_SPLIT', `1') 39540266059SGregory Neil Shapiro 396c2aa98e2SPeter Wemm# queue directory 39706f25ae9SGregory Neil ShapiroO QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, `/var/spool/mqueue') 398c2aa98e2SPeter Wemm 399d0cef73dSGregory Neil Shapiro# key for shared memory; 0 to turn off, -1 to auto-select 40040266059SGregory Neil Shapiro_OPTION(SharedMemoryKey, `confSHARED_MEMORY_KEY', `0') 40140266059SGregory Neil Shapiro 402d0cef73dSGregory Neil Shapiro# file to store auto-selected key for shared memory (SharedMemoryKey = -1) 403d0cef73dSGregory Neil Shapiro_OPTION(SharedMemoryKeyFile, `confSHARED_MEMORY_KEY_FILE', `') 404605302a5SGregory Neil Shapiro 405c2aa98e2SPeter Wemm# timeouts (many of these) 40606f25ae9SGregory Neil Shapiro_OPTION(Timeout.initial, `confTO_INITIAL', `5m') 40706f25ae9SGregory Neil Shapiro_OPTION(Timeout.connect, `confTO_CONNECT', `5m') 40840266059SGregory Neil Shapiro_OPTION(Timeout.aconnect, `confTO_ACONNECT', `0s') 40906f25ae9SGregory Neil Shapiro_OPTION(Timeout.iconnect, `confTO_ICONNECT', `5m') 41006f25ae9SGregory Neil Shapiro_OPTION(Timeout.helo, `confTO_HELO', `5m') 41106f25ae9SGregory Neil Shapiro_OPTION(Timeout.mail, `confTO_MAIL', `10m') 41206f25ae9SGregory Neil Shapiro_OPTION(Timeout.rcpt, `confTO_RCPT', `1h') 41306f25ae9SGregory Neil Shapiro_OPTION(Timeout.datainit, `confTO_DATAINIT', `5m') 41406f25ae9SGregory Neil Shapiro_OPTION(Timeout.datablock, `confTO_DATABLOCK', `1h') 41506f25ae9SGregory Neil Shapiro_OPTION(Timeout.datafinal, `confTO_DATAFINAL', `1h') 41606f25ae9SGregory Neil Shapiro_OPTION(Timeout.rset, `confTO_RSET', `5m') 41706f25ae9SGregory Neil Shapiro_OPTION(Timeout.quit, `confTO_QUIT', `2m') 41806f25ae9SGregory Neil Shapiro_OPTION(Timeout.misc, `confTO_MISC', `2m') 41906f25ae9SGregory Neil Shapiro_OPTION(Timeout.command, `confTO_COMMAND', `1h') 42006f25ae9SGregory Neil Shapiro_OPTION(Timeout.ident, `confTO_IDENT', `5s') 42106f25ae9SGregory Neil Shapiro_OPTION(Timeout.fileopen, `confTO_FILEOPEN', `60s') 42206f25ae9SGregory Neil Shapiro_OPTION(Timeout.control, `confTO_CONTROL', `2m') 42306f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuereturn, `confTO_QUEUERETURN', `5d') 42406f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuereturn.normal, `confTO_QUEUERETURN_NORMAL', `5d') 42506f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuereturn.urgent, `confTO_QUEUERETURN_URGENT', `2d') 42606f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuereturn.non-urgent, `confTO_QUEUERETURN_NONURGENT', `7d') 427e92d3f3fSGregory Neil Shapiro_OPTION(Timeout.queuereturn.dsn, `confTO_QUEUERETURN_DSN', `5d') 42806f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', `4h') 42906f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', `4h') 43006f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', `1h') 43106f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', `12h') 432e92d3f3fSGregory Neil Shapiro_OPTION(Timeout.queuewarn.dsn, `confTO_QUEUEWARN_DSN', `4h') 43306f25ae9SGregory Neil Shapiro_OPTION(Timeout.hoststatus, `confTO_HOSTSTATUS', `30m') 43406f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retrans, `confTO_RESOLVER_RETRANS', `5s') 43506f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retrans.first, `confTO_RESOLVER_RETRANS_FIRST', `5s') 43606f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retrans.normal, `confTO_RESOLVER_RETRANS_NORMAL', `5s') 43706f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retry, `confTO_RESOLVER_RETRY', `4') 43806f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retry.first, `confTO_RESOLVER_RETRY_FIRST', `4') 43906f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retry.normal, `confTO_RESOLVER_RETRY_NORMAL', `4') 44040266059SGregory Neil Shapiro_OPTION(Timeout.lhlo, `confTO_LHLO', `2m') 44140266059SGregory Neil Shapiro_OPTION(Timeout.auth, `confTO_AUTH', `10m') 44240266059SGregory Neil Shapiro_OPTION(Timeout.starttls, `confTO_STARTTLS', `1h') 44340266059SGregory Neil Shapiro 44440266059SGregory Neil Shapiro# time for DeliverBy; extension disabled if less than 0 44540266059SGregory Neil Shapiro_OPTION(DeliverByMin, `confDELIVER_BY_MIN', `0') 446c2aa98e2SPeter Wemm 447c2aa98e2SPeter Wemm# should we not prune routes in route-addr syntax addresses? 44806f25ae9SGregory Neil Shapiro_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES', `False') 449c2aa98e2SPeter Wemm 450c2aa98e2SPeter Wemm# queue up everything before forking? 45106f25ae9SGregory Neil Shapiro_OPTION(SuperSafe, `confSAFE_QUEUE', `True') 452c2aa98e2SPeter Wemm 453c2aa98e2SPeter Wemm# status file 454d0cef73dSGregory Neil Shapiro_OPTION(StatusFile, `STATUS_FILE') 455c2aa98e2SPeter Wemm 456c2aa98e2SPeter Wemm# time zone handling: 457c2aa98e2SPeter Wemm# if undefined, use system default 458c2aa98e2SPeter Wemm# if defined but null, use TZ envariable passed in 459c2aa98e2SPeter Wemm# if defined and non-null, use that info 460c2aa98e2SPeter Wemmifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=', 461c2aa98e2SPeter Wemm confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=', 462c2aa98e2SPeter Wemm `O TimeZoneSpec=confTIME_ZONE') 463c2aa98e2SPeter Wemm 464c2aa98e2SPeter Wemm# default UID (can be username or userid:groupid) 46506f25ae9SGregory Neil Shapiro_OPTION(DefaultUser, `confDEF_USER_ID', `mailnull') 466c2aa98e2SPeter Wemm 467c2aa98e2SPeter Wemm# list of locations of user database file (null means no lookup) 46806f25ae9SGregory Neil Shapiro_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', `MAIL_SETTINGS_DIR`'userdb') 469c2aa98e2SPeter Wemm 470c2aa98e2SPeter Wemm# fallback MX host 47106f25ae9SGregory Neil Shapiro_OPTION(FallbackMXhost, `confFALLBACK_MX', `fall.back.host.net') 472c2aa98e2SPeter Wemm 473e92d3f3fSGregory Neil Shapiro# fallback smart host 474e92d3f3fSGregory Neil Shapiro_OPTION(FallbackSmartHost, `confFALLBACK_SMARTHOST', `fall.back.host.net') 475e92d3f3fSGregory Neil Shapiro 476c2aa98e2SPeter Wemm# if we are the best MX host for a site, try it directly instead of config err 47706f25ae9SGregory Neil Shapiro_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST', `False') 478c2aa98e2SPeter Wemm 479c2aa98e2SPeter Wemm# load average at which we just queue messages 48006f25ae9SGregory Neil Shapiro_OPTION(QueueLA, `confQUEUE_LA', `8') 481c2aa98e2SPeter Wemm 482c2aa98e2SPeter Wemm# load average at which we refuse connections 48306f25ae9SGregory Neil Shapiro_OPTION(RefuseLA, `confREFUSE_LA', `12') 484c2aa98e2SPeter Wemm 485e92d3f3fSGregory Neil Shapiro# log interval when refusing connections for this long 486e92d3f3fSGregory Neil Shapiro_OPTION(RejectLogInterval, `confREJECT_LOG_INTERVAL', `3h') 487e92d3f3fSGregory Neil Shapiro 48840266059SGregory Neil Shapiro# load average at which we delay connections; 0 means no limit 48940266059SGregory Neil Shapiro_OPTION(DelayLA, `confDELAY_LA', `0') 49040266059SGregory Neil Shapiro 491c2aa98e2SPeter Wemm# maximum number of children we allow at one time 492739ac4d4SGregory Neil Shapiro_OPTION(MaxDaemonChildren, `confMAX_DAEMON_CHILDREN', `0') 493c2aa98e2SPeter Wemm 494c2aa98e2SPeter Wemm# maximum number of new connections per second 495193538b7SGregory Neil Shapiro_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', `0') 496c2aa98e2SPeter Wemm 497e92d3f3fSGregory Neil Shapiro# Width of the window 498e92d3f3fSGregory Neil Shapiro_OPTION(ConnectionRateWindowSize, `confCONNECTION_RATE_WINDOW_SIZE', `60s') 499e92d3f3fSGregory Neil Shapiro 500c2aa98e2SPeter Wemm# work recipient factor 50106f25ae9SGregory Neil Shapiro_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', `30000') 502c2aa98e2SPeter Wemm 503c2aa98e2SPeter Wemm# deliver each queued job in a separate process? 50406f25ae9SGregory Neil Shapiro_OPTION(ForkEachJob, `confSEPARATE_PROC', `False') 505c2aa98e2SPeter Wemm 506c2aa98e2SPeter Wemm# work class factor 50706f25ae9SGregory Neil Shapiro_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', `1800') 508c2aa98e2SPeter Wemm 509c2aa98e2SPeter Wemm# work time factor 51006f25ae9SGregory Neil Shapiro_OPTION(RetryFactor, `confWORK_TIME_FACTOR', `90000') 511c2aa98e2SPeter Wemm 512c2aa98e2SPeter Wemm# default character set 513b6bacd31SGregory Neil Shapiro_OPTION(DefaultCharSet, `confDEF_CHAR_SET', `unknown-8bit') 514c2aa98e2SPeter Wemm 51540266059SGregory Neil Shapiro# service switch file (name hardwired on Solaris, Ultrix, OSF/1, others) 51606f25ae9SGregory Neil Shapiro_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', `MAIL_SETTINGS_DIR`'service.switch') 517c2aa98e2SPeter Wemm 518c2aa98e2SPeter Wemm# hosts file (normally /etc/hosts) 51906f25ae9SGregory Neil Shapiro_OPTION(HostsFile, `confHOSTS_FILE', `/etc/hosts') 520c2aa98e2SPeter Wemm 521c2aa98e2SPeter Wemm# dialup line delay on connection failure 5224e4196cbSGregory Neil Shapiro_OPTION(DialDelay, `confDIAL_DELAY', `0s') 523c2aa98e2SPeter Wemm 524c2aa98e2SPeter Wemm# action to take if there are no recipients in the message 5254e4196cbSGregory Neil Shapiro_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', `none') 526c2aa98e2SPeter Wemm 527c2aa98e2SPeter Wemm# chrooted environment for writing to files 5284e4196cbSGregory Neil Shapiro_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', `') 529c2aa98e2SPeter Wemm 530c2aa98e2SPeter Wemm# are colons OK in addresses? 53106f25ae9SGregory Neil Shapiro_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR', `True') 532c2aa98e2SPeter Wemm 533c2aa98e2SPeter Wemm# shall I avoid expanding CNAMEs (violates protocols)? 53406f25ae9SGregory Neil Shapiro_OPTION(DontExpandCnames, `confDONT_EXPAND_CNAMES', `False') 535c2aa98e2SPeter Wemm 536c2aa98e2SPeter Wemm# SMTP initial login message (old $e macro) 53706f25ae9SGregory Neil Shapiro_OPTION(SmtpGreetingMessage, `confSMTP_LOGIN_MSG', `$j Sendmail $v ready at $b') 538c2aa98e2SPeter Wemm 539c2aa98e2SPeter Wemm# UNIX initial From header format (old $l macro) 54006f25ae9SGregory Neil Shapiro_OPTION(UnixFromLine, `confFROM_LINE', `From $g $d') 541c2aa98e2SPeter Wemm 542c2aa98e2SPeter Wemm# From: lines that have embedded newlines are unwrapped onto one line 54306f25ae9SGregory Neil Shapiro_OPTION(SingleLineFromHeader, `confSINGLE_LINE_FROM_HEADER', `False') 544c2aa98e2SPeter Wemm 545c2aa98e2SPeter Wemm# Allow HELO SMTP command that does not `include' a host name 54606f25ae9SGregory Neil Shapiro_OPTION(AllowBogusHELO, `confALLOW_BOGUS_HELO', `False') 547c2aa98e2SPeter Wemm 548c2aa98e2SPeter Wemm# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) 54906f25ae9SGregory Neil Shapiro_OPTION(MustQuoteChars, `confMUST_QUOTE_CHARS', `.') 550c2aa98e2SPeter Wemm 551c2aa98e2SPeter Wemm# delimiter (operator) characters (old $o macro) 55206f25ae9SGregory Neil Shapiro_OPTION(OperatorChars, `confOPERATORS', `.:@[]') 553c2aa98e2SPeter Wemm 554c2aa98e2SPeter Wemm# shall I avoid calling initgroups(3) because of high NIS costs? 55506f25ae9SGregory Neil Shapiro_OPTION(DontInitGroups, `confDONT_INIT_GROUPS', `False') 556c2aa98e2SPeter Wemm 557c2aa98e2SPeter Wemm# are group-writable `:include:' and .forward files (un)trustworthy? 55840266059SGregory Neil Shapiro# True (the default) means they are not trustworthy. 55906f25ae9SGregory Neil Shapiro_OPTION(UnsafeGroupWrites, `confUNSAFE_GROUP_WRITES', `True') 56040266059SGregory Neil Shapiroifdef(`confUNSAFE_GROUP_WRITES', 56140266059SGregory Neil Shapiro`errprint(`WARNING: confUNSAFE_GROUP_WRITES is deprecated; use confDONT_BLAME_SENDMAIL. 56240266059SGregory Neil Shapiro')') 563c2aa98e2SPeter Wemm 564c2aa98e2SPeter Wemm# where do errors that occur when sending errors get sent? 56506f25ae9SGregory Neil Shapiro_OPTION(DoubleBounceAddress, `confDOUBLE_BOUNCE_ADDRESS', `postmaster') 56606f25ae9SGregory Neil Shapiro 567d0cef73dSGregory Neil Shapiro# issue temporary errors (4xy) instead of permanent errors (5xy)? 568d0cef73dSGregory Neil Shapiro_OPTION(SoftBounce, `confSOFT_BOUNCE', `False') 569d0cef73dSGregory Neil Shapiro 57006f25ae9SGregory Neil Shapiro# where to save bounces if all else fails 57106f25ae9SGregory Neil Shapiro_OPTION(DeadLetterDrop, `confDEAD_LETTER_DROP', `/var/tmp/dead.letter') 572c2aa98e2SPeter Wemm 573c2aa98e2SPeter Wemm# what user id do we assume for the majority of the processing? 57406f25ae9SGregory Neil Shapiro_OPTION(RunAsUser, `confRUN_AS_USER', `sendmail') 575c2aa98e2SPeter Wemm 576c2aa98e2SPeter Wemm# maximum number of recipients per SMTP envelope 577e92d3f3fSGregory Neil Shapiro_OPTION(MaxRecipientsPerMessage, `confMAX_RCPTS_PER_MESSAGE', `0') 578c2aa98e2SPeter Wemm 57940266059SGregory Neil Shapiro# limit the rate recipients per SMTP envelope are accepted 58040266059SGregory Neil Shapiro# once the threshold number of recipients have been rejected 581e92d3f3fSGregory Neil Shapiro_OPTION(BadRcptThrottle, `confBAD_RCPT_THROTTLE', `0') 58240266059SGregory Neil Shapiro 583c2aa98e2SPeter Wemm# shall we get local names from our installed interfaces? 58406f25ae9SGregory Neil Shapiro_OPTION(DontProbeInterfaces, `confDONT_PROBE_INTERFACES', `False') 585c2aa98e2SPeter Wemm 58606f25ae9SGregory Neil Shapiro# Return-Receipt-To: header implies DSN request 58706f25ae9SGregory Neil Shapiro_OPTION(RrtImpliesDsn, `confRRT_IMPLIES_DSN', `False') 58806f25ae9SGregory Neil Shapiro 58906f25ae9SGregory Neil Shapiro# override connection address (for testing) 59006f25ae9SGregory Neil Shapiro_OPTION(ConnectOnlyTo, `confCONNECT_ONLY_TO', `0.0.0.0') 59106f25ae9SGregory Neil Shapiro 59206f25ae9SGregory Neil Shapiro# Trusted user for file ownership and starting the daemon 59306f25ae9SGregory Neil Shapiro_OPTION(TrustedUser, `confTRUSTED_USER', `root') 59406f25ae9SGregory Neil Shapiro 59506f25ae9SGregory Neil Shapiro# Control socket for daemon management 59606f25ae9SGregory Neil Shapiro_OPTION(ControlSocketName, `confCONTROL_SOCKET_NAME', `/var/spool/mqueue/.control') 59706f25ae9SGregory Neil Shapiro 59806f25ae9SGregory Neil Shapiro# Maximum MIME header length to protect MUAs 599e92d3f3fSGregory Neil Shapiro_OPTION(MaxMimeHeaderLength, `confMAX_MIME_HEADER_LENGTH', `0/0') 60006f25ae9SGregory Neil Shapiro 60106f25ae9SGregory Neil Shapiro# Maximum length of the sum of all headers 60206f25ae9SGregory Neil Shapiro_OPTION(MaxHeadersLength, `confMAX_HEADERS_LENGTH', `32768') 60306f25ae9SGregory Neil Shapiro 60406f25ae9SGregory Neil Shapiro# Maximum depth of alias recursion 60506f25ae9SGregory Neil Shapiro_OPTION(MaxAliasRecursion, `confMAX_ALIAS_RECURSION', `10') 60606f25ae9SGregory Neil Shapiro 60706f25ae9SGregory Neil Shapiro# location of pid file 60806f25ae9SGregory Neil Shapiro_OPTION(PidFile, `confPID_FILE', `/var/run/sendmail.pid') 60906f25ae9SGregory Neil Shapiro 61006f25ae9SGregory Neil Shapiro# Prefix string for the process title shown on 'ps' listings 61106f25ae9SGregory Neil Shapiro_OPTION(ProcessTitlePrefix, `confPROCESS_TITLE_PREFIX', `prefix') 61206f25ae9SGregory Neil Shapiro 61306f25ae9SGregory Neil Shapiro# Data file (df) memory-buffer file maximum size 61406f25ae9SGregory Neil Shapiro_OPTION(DataFileBufferSize, `confDF_BUFFER_SIZE', `4096') 61506f25ae9SGregory Neil Shapiro 61606f25ae9SGregory Neil Shapiro# Transcript file (xf) memory-buffer file maximum size 61706f25ae9SGregory Neil Shapiro_OPTION(XscriptFileBufferSize, `confXF_BUFFER_SIZE', `4096') 61806f25ae9SGregory Neil Shapiro 61940266059SGregory Neil Shapiro# lookup type to find information about local mailboxes 62040266059SGregory Neil Shapiro_OPTION(MailboxDatabase, `confMAILBOX_DATABASE', `pw') 62140266059SGregory Neil Shapiro 622e92d3f3fSGregory Neil Shapiro# override compile time flag REQUIRES_DIR_FSYNC 623e92d3f3fSGregory Neil Shapiro_OPTION(RequiresDirfsync, `confREQUIRES_DIR_FSYNC', `true') 624e92d3f3fSGregory Neil Shapiro 62506f25ae9SGregory Neil Shapiro# list of authentication mechanisms 62640266059SGregory Neil Shapiro_OPTION(AuthMechanisms, `confAUTH_MECHANISMS', `EXTERNAL GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5') 62706f25ae9SGregory Neil Shapiro 628e92d3f3fSGregory Neil Shapiro# Authentication realm 629e92d3f3fSGregory Neil Shapiro_OPTION(AuthRealm, `confAUTH_REALM', `') 630e92d3f3fSGregory Neil Shapiro 63106f25ae9SGregory Neil Shapiro# default authentication information for outgoing connections 63206f25ae9SGregory Neil Shapiro_OPTION(DefaultAuthInfo, `confDEF_AUTH_INFO', `MAIL_SETTINGS_DIR`'default-auth-info') 63306f25ae9SGregory Neil Shapiro 63406f25ae9SGregory Neil Shapiro# SMTP AUTH flags 63506f25ae9SGregory Neil Shapiro_OPTION(AuthOptions, `confAUTH_OPTIONS', `') 63606f25ae9SGregory Neil Shapiro 63740266059SGregory Neil Shapiro# SMTP AUTH maximum encryption strength 63840266059SGregory Neil Shapiro_OPTION(AuthMaxBits, `confAUTH_MAX_BITS', `') 63940266059SGregory Neil Shapiro 64040266059SGregory Neil Shapiro# SMTP STARTTLS server options 64140266059SGregory Neil Shapiro_OPTION(TLSSrvOptions, `confTLS_SRV_OPTIONS', `') 64240266059SGregory Neil Shapiro 64306f25ae9SGregory Neil Shapiro# Input mail filters 64406f25ae9SGregory Neil Shapiro_OPTION(InputMailFilters, `confINPUT_MAIL_FILTERS', `') 64506f25ae9SGregory Neil Shapiro 646739ac4d4SGregory Neil Shapiroifelse(len(X`'_MAIL_FILTERS_DEF), `1', `dnl', `dnl 64706f25ae9SGregory Neil Shapiro# Milter options 64840266059SGregory Neil Shapiro_OPTION(Milter.LogLevel, `confMILTER_LOG_LEVEL', `') 64906f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.connect, `confMILTER_MACROS_CONNECT', `') 65006f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.helo, `confMILTER_MACROS_HELO', `') 65106f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.envfrom, `confMILTER_MACROS_ENVFROM', `') 652323f6dcbSGregory Neil Shapiro_OPTION(Milter.macros.envrcpt, `confMILTER_MACROS_ENVRCPT', `') 653d0cef73dSGregory Neil Shapiro_OPTION(Milter.macros.eom, `confMILTER_MACROS_EOM', `') 654d0cef73dSGregory Neil Shapiro_OPTION(Milter.macros.eoh, `confMILTER_MACROS_EOH', `') 655d0cef73dSGregory Neil Shapiro_OPTION(Milter.macros.data, `confMILTER_MACROS_DATA', `')') 65606f25ae9SGregory Neil Shapiro 65706f25ae9SGregory Neil Shapiro# CA directory 65813bd1963SGregory Neil Shapiro_OPTION(CACertPath, `confCACERT_PATH', `') 65906f25ae9SGregory Neil Shapiro# CA file 66013bd1963SGregory Neil Shapiro_OPTION(CACertFile, `confCACERT', `') 66106f25ae9SGregory Neil Shapiro# Server Cert 66206f25ae9SGregory Neil Shapiro_OPTION(ServerCertFile, `confSERVER_CERT', `') 66306f25ae9SGregory Neil Shapiro# Server private key 66406f25ae9SGregory Neil Shapiro_OPTION(ServerKeyFile, `confSERVER_KEY', `') 66506f25ae9SGregory Neil Shapiro# Client Cert 66606f25ae9SGregory Neil Shapiro_OPTION(ClientCertFile, `confCLIENT_CERT', `') 66706f25ae9SGregory Neil Shapiro# Client private key 66806f25ae9SGregory Neil Shapiro_OPTION(ClientKeyFile, `confCLIENT_KEY', `') 669e92d3f3fSGregory Neil Shapiro# File containing certificate revocation lists 670e92d3f3fSGregory Neil Shapiro_OPTION(CRLFile, `confCRL', `') 67106f25ae9SGregory Neil Shapiro# DHParameters (only required if DSA/DH is used) 67206f25ae9SGregory Neil Shapiro_OPTION(DHParameters, `confDH_PARAMETERS', `') 67306f25ae9SGregory Neil Shapiro# Random data source (required for systems without /dev/urandom under OpenSSL) 67406f25ae9SGregory Neil Shapiro_OPTION(RandFile, `confRAND_FILE', `') 67506f25ae9SGregory Neil Shapiro 676d0cef73dSGregory Neil Shapiro# Maximum number of "useless" commands before slowing down 677d0cef73dSGregory Neil Shapiro_OPTION(MaxNOOPCommands, `confMAX_NOOP_COMMANDS', `20') 678d0cef73dSGregory Neil Shapiro 679d0cef73dSGregory Neil Shapiro# Name to use for EHLO (defaults to $j) 680d0cef73dSGregory Neil Shapiro_OPTION(HeloName, `confHELO_NAME') 681d0cef73dSGregory Neil Shapiro 68240266059SGregory Neil Shapiro############################ 68340266059SGregory Neil Shapiro`# QUEUE GROUP DEFINITIONS #' 68440266059SGregory Neil Shapiro############################ 68540266059SGregory Neil Shapiro_QUEUE_GROUP_ 686065a643dSPeter Wemm 687c2aa98e2SPeter Wemm########################### 688c2aa98e2SPeter Wemm# Message precedences # 689c2aa98e2SPeter Wemm########################### 690c2aa98e2SPeter Wemm 691c2aa98e2SPeter WemmPfirst-class=0 692c2aa98e2SPeter WemmPspecial-delivery=100 693c2aa98e2SPeter WemmPlist=-30 694c2aa98e2SPeter WemmPbulk=-60 695c2aa98e2SPeter WemmPjunk=-100 696c2aa98e2SPeter Wemm 697c2aa98e2SPeter Wemm##################### 698c2aa98e2SPeter Wemm# Trusted users # 699c2aa98e2SPeter Wemm##################### 700c2aa98e2SPeter Wemm 701c2aa98e2SPeter Wemm# this is equivalent to setting class "t" 70206f25ae9SGregory Neil Shapiroifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, `MAIL_SETTINGS_DIR`'trusted-users') 703c2aa98e2SPeter WemmTroot 704c2aa98e2SPeter WemmTdaemon 705c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', `Tuucp') 706c2aa98e2SPeter Wemmifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl') 707c2aa98e2SPeter Wemm 708c2aa98e2SPeter Wemm######################### 709c2aa98e2SPeter Wemm# Format of headers # 710c2aa98e2SPeter Wemm######################### 711c2aa98e2SPeter Wemm 712c2aa98e2SPeter Wemmifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl 713e92d3f3fSGregory Neil Shapiroifdef(`confMESSAGEID_HEADER',, `define(`confMESSAGEID_HEADER', `<$t.$i@$j>')')dnl 714c2aa98e2SPeter WemmH?P?Return-Path: <$g> 715c2aa98e2SPeter WemmHReceived: confRECEIVED_HEADER 716c2aa98e2SPeter WemmH?D?Resent-Date: $a 717c2aa98e2SPeter WemmH?D?Date: $a 718c2aa98e2SPeter WemmH?F?Resent-From: confFROM_HEADER 719c2aa98e2SPeter WemmH?F?From: confFROM_HEADER 720c2aa98e2SPeter WemmH?x?Full-Name: $x 721c2aa98e2SPeter Wemm# HPosted-Date: $a 722c2aa98e2SPeter Wemm# H?l?Received-Date: $b 723e92d3f3fSGregory Neil ShapiroH?M?Resent-Message-Id: confMESSAGEID_HEADER 724e92d3f3fSGregory Neil ShapiroH?M?Message-Id: confMESSAGEID_HEADER 72506f25ae9SGregory Neil Shapiro 726c2aa98e2SPeter Wemm# 727c2aa98e2SPeter Wemm###################################################################### 728c2aa98e2SPeter Wemm###################################################################### 729c2aa98e2SPeter Wemm##### 730c2aa98e2SPeter Wemm##### REWRITING RULES 731c2aa98e2SPeter Wemm##### 732c2aa98e2SPeter Wemm###################################################################### 733c2aa98e2SPeter Wemm###################################################################### 734c2aa98e2SPeter Wemm 735c2aa98e2SPeter Wemm############################################ 736c2aa98e2SPeter Wemm### Ruleset 3 -- Name Canonicalization ### 737c2aa98e2SPeter Wemm############################################ 73806f25ae9SGregory Neil ShapiroScanonify=3 739c2aa98e2SPeter Wemm 740c2aa98e2SPeter Wemm# handle null input (translate to <@> special case) 741c2aa98e2SPeter WemmR$@ $@ <@> 742c2aa98e2SPeter Wemm 743c2aa98e2SPeter Wemm# strip group: syntax (not inside angle brackets!) and trailing semicolon 744c2aa98e2SPeter WemmR$* $: $1 <@> mark addresses 745c2aa98e2SPeter WemmR$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> 746c2aa98e2SPeter WemmR@ $* <@> $: @ $1 unmark @host:... 74740266059SGregory Neil ShapiroR$* [ IPv6 : $+ ] <@> $: $1 [ IPv6 : $2 ] unmark IPv6 addr 748c2aa98e2SPeter WemmR$* :: $* <@> $: $1 :: $2 unmark node::addr 749c2aa98e2SPeter WemmR:`include': $* <@> $: :`include': $1 unmark :`include':... 750c2aa98e2SPeter WemmR$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon 751c2aa98e2SPeter WemmR$* : $* <@> $: $2 strip colon if marked 752c2aa98e2SPeter WemmR$* <@> $: $1 unmark 753c2aa98e2SPeter WemmR$* ; $1 strip trailing semi 754193538b7SGregory Neil ShapiroR$* < $+ :; > $* $@ $2 :; <@> catch <list:;> 755c2aa98e2SPeter WemmR$* < $* ; > $1 < $2 > bogus bracketed semi 756c2aa98e2SPeter Wemm 757c2aa98e2SPeter Wemm# null input now results from list:; syntax 758c2aa98e2SPeter WemmR$@ $@ :; <@> 759c2aa98e2SPeter Wemm 760c2aa98e2SPeter Wemm# strip angle brackets -- note RFC733 heuristic to get innermost item 761c2aa98e2SPeter WemmR$* $: < $1 > housekeeping <> 762c2aa98e2SPeter WemmR$+ < $* > < $2 > strip excess on left 763c2aa98e2SPeter WemmR< $* > $+ < $1 > strip excess on right 764c2aa98e2SPeter WemmR<> $@ < @ > MAIL FROM:<> case 765c2aa98e2SPeter WemmR< $+ > $: $1 remove housekeeping <> 766c2aa98e2SPeter Wemm 76706f25ae9SGregory Neil Shapiroifdef(`_USE_DEPRECATED_ROUTE_ADDR_',`dnl 768c2aa98e2SPeter Wemm# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later 769c2aa98e2SPeter WemmR@ $+ , $+ @ $1 : $2 change all "," to ":" 770c2aa98e2SPeter Wemm 771c2aa98e2SPeter Wemm# localize and dispose of route-based addresses 77240266059SGregory Neil Shapirodnl XXX: IPv6 colon conflict 77340266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl', 77440266059SGregory Neil Shapiro`R@ [$+] : $+ $@ $>Canonify2 < @ [$1] > : $2 handle <route-addr>') 77506f25ae9SGregory Neil ShapiroR@ $+ : $+ $@ $>Canonify2 < @$1 > : $2 handle <route-addr> 77606f25ae9SGregory Neil Shapirodnl',`dnl 77706f25ae9SGregory Neil Shapiro# strip route address <@a,@b,@c:user@d> -> <user@d> 77806f25ae9SGregory Neil ShapiroR@ $+ , $+ $2 77940266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl', 78040266059SGregory Neil Shapiro`R@ [ $* ] : $+ $2') 78106f25ae9SGregory Neil ShapiroR@ $+ : $+ $2 78206f25ae9SGregory Neil Shapirodnl') 783c2aa98e2SPeter Wemm 784c2aa98e2SPeter Wemm# find focus for list syntax 78506f25ae9SGregory Neil ShapiroR $+ : $* ; @ $+ $@ $>Canonify2 $1 : $2 ; < @ $3 > list syntax 786c2aa98e2SPeter WemmR $+ : $* ; $@ $1 : $2; list syntax 787c2aa98e2SPeter Wemm 788c2aa98e2SPeter Wemm# find focus for @ syntax addresses 789c2aa98e2SPeter WemmR$+ @ $+ $: $1 < @ $2 > focus on domain 790c2aa98e2SPeter WemmR$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right 79106f25ae9SGregory Neil ShapiroR$+ < @ $+ > $@ $>Canonify2 $1 < @ $2 > already canonical 792c2aa98e2SPeter Wemm 79340266059SGregory Neil Shapirodnl This is flagged as an error in S0; no need to silently fix it here. 79440266059SGregory Neil Shapirodnl # do some sanity checking 79540266059SGregory Neil Shapirodnl R$* < @ $~[ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs 796c2aa98e2SPeter Wemm 797c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 798c2aa98e2SPeter Wemm`# convert old-style addresses to a domain-based address 79906f25ae9SGregory Neil ShapiroR$- ! $+ $@ $>Canonify2 $2 < @ $1 .UUCP > resolve uucp names 80006f25ae9SGregory Neil ShapiroR$+ . $- ! $+ $@ $>Canonify2 $3 < @ $1 . $2 > domain uucps 80106f25ae9SGregory Neil ShapiroR$+ ! $+ $@ $>Canonify2 $2 < @ $1 .UUCP > uucp subdomains 802c2aa98e2SPeter Wemm') 803c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_', 804c2aa98e2SPeter Wemm`# convert node::user addresses into a domain-based address 80506f25ae9SGregory Neil ShapiroR$- :: $+ $@ $>Canonify2 $2 < @ $1 .DECNET > resolve DECnet names 80606f25ae9SGregory Neil ShapiroR$- . $- :: $+ $@ $>Canonify2 $3 < @ $1.$2 .DECNET > numeric DECnet addr 807c2aa98e2SPeter Wemm', 808c2aa98e2SPeter Wemm `dnl') 809c2aa98e2SPeter Wemm# if we have % signs, take the rightmost one 810c2aa98e2SPeter WemmR$* % $* $1 @ $2 First make them all @s. 811c2aa98e2SPeter WemmR$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. 81206f25ae9SGregory Neil ShapiroR$* @ $* $@ $>Canonify2 $1 < @ $2 > Insert < > and finish 813c2aa98e2SPeter Wemm 814c2aa98e2SPeter Wemm# else we must be a local name 81506f25ae9SGregory Neil ShapiroR$* $@ $>Canonify2 $1 816c2aa98e2SPeter Wemm 817c2aa98e2SPeter Wemm 818c2aa98e2SPeter Wemm################################################ 819c2aa98e2SPeter Wemm### Ruleset 96 -- bottom half of ruleset 3 ### 820c2aa98e2SPeter Wemm################################################ 821c2aa98e2SPeter Wemm 82206f25ae9SGregory Neil ShapiroSCanonify2=96 823c2aa98e2SPeter Wemm 824c2aa98e2SPeter Wemm# handle special cases for local names 825c2aa98e2SPeter WemmR$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all 826c2aa98e2SPeter WemmR$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain 827c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 828c2aa98e2SPeter Wemm`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain') 82906f25ae9SGregory Neil Shapiro 83040266059SGregory Neil Shapiro# check for IPv4/IPv6 domain literal 83140266059SGregory Neil ShapiroR$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [addr] 832c2aa98e2SPeter WemmR$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal 833c2aa98e2SPeter WemmR$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr 834c2aa98e2SPeter Wemm 83506f25ae9SGregory Neil Shapiroifdef(`_DOMAIN_TABLE_', `dnl 836c2aa98e2SPeter Wemm# look up domains in the domain table 837c2aa98e2SPeter WemmR$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3', `dnl') 838c2aa98e2SPeter Wemm 83906f25ae9SGregory Neil Shapiroundivert(2)dnl LOCAL_RULE_3 840c2aa98e2SPeter Wemm 84106f25ae9SGregory Neil Shapiroifdef(`_BITDOMAIN_TABLE_', `dnl 842c2aa98e2SPeter Wemm# handle BITNET mapping 843c2aa98e2SPeter WemmR$* < @ $+ .BITNET > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3', `dnl') 844c2aa98e2SPeter Wemm 84506f25ae9SGregory Neil Shapiroifdef(`_UUDOMAIN_TABLE_', `dnl 846c2aa98e2SPeter Wemm# handle UUCP mapping 847c2aa98e2SPeter WemmR$* < @ $+ .UUCP > $* $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3', `dnl') 848c2aa98e2SPeter Wemm 849c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 850c2aa98e2SPeter Wemm`ifdef(`UUCP_RELAY', 851c2aa98e2SPeter Wemm`# pass UUCP addresses straight through 852c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', 853c2aa98e2SPeter Wemm`# if really UUCP, handle it immediately 854c2aa98e2SPeter Wemmifdef(`_CLASS_U_', 855c2aa98e2SPeter Wemm`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 856c2aa98e2SPeter Wemmifdef(`_CLASS_V_', 857c2aa98e2SPeter Wemm`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 858c2aa98e2SPeter Wemmifdef(`_CLASS_W_', 859c2aa98e2SPeter Wemm`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 860c2aa98e2SPeter Wemmifdef(`_CLASS_X_', 861c2aa98e2SPeter Wemm`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 862c2aa98e2SPeter Wemmifdef(`_CLASS_Y_', 863c2aa98e2SPeter Wemm`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 864c2aa98e2SPeter Wemm 865c2aa98e2SPeter Wemmifdef(`_NO_CANONIFY_', `dnl', `dnl 866c2aa98e2SPeter Wemm# try UUCP traffic as a local address 867c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 868c2aa98e2SPeter WemmR$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') 869c2aa98e2SPeter Wemm')') 87006f25ae9SGregory Neil Shapiro# hostnames ending in class P are always canonical 87106f25ae9SGregory Neil ShapiroR$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 87206f25ae9SGregory Neil Shapirodnl apply the next rule only for hostnames not in class P 87306f25ae9SGregory Neil Shapirodnl this even works for phrases in class P since . is in class P 87406f25ae9SGregory Neil Shapirodnl which daemon flags are set? 87506f25ae9SGregory Neil ShapiroR$* < @ $* $~P > $* $: $&{daemon_flags} $| $1 < @ $2 $3 > $4 87606f25ae9SGregory Neil Shapirodnl the other rules in this section only apply if the hostname 87706f25ae9SGregory Neil Shapirodnl does not end in class P hence no further checks are done here 87806f25ae9SGregory Neil Shapirodnl if this ever changes make sure the lookups are "protected" again! 87906f25ae9SGregory Neil Shapiroifdef(`_NO_CANONIFY_', `dnl 88006f25ae9SGregory Neil Shapirodnl do not canonify unless: 88106f25ae9SGregory Neil Shapirodnl domain ends in class {Canonify} (this does not work if the intersection 88206f25ae9SGregory Neil Shapirodnl with class P is non-empty) 88306f25ae9SGregory Neil Shapirodnl or {daemon_flags} has c set 88406f25ae9SGregory Neil Shapiro# pass to name server to make hostname canonical if in class {Canonify} 88506f25ae9SGregory Neil ShapiroR$* $| $* < @ $* $={Canonify} > $* $: $2 < @ $[ $3 $4 $] > $5 88606f25ae9SGregory Neil Shapiro# pass to name server to make hostname canonical if requested 88706f25ae9SGregory Neil ShapiroR$* c $* $| $* < @ $* > $* $: $3 < @ $[ $4 $] > $5 88806f25ae9SGregory Neil Shapirodnl trailing dot? -> do not apply _CANONIFY_HOSTS_ 88906f25ae9SGregory Neil ShapiroR$* $| $* < @ $+ . > $* $: $2 < @ $3 . > $4 89006f25ae9SGregory Neil Shapiro# add a trailing dot to qualified hostnames so other rules will work 89106f25ae9SGregory Neil ShapiroR$* $| $* < @ $+.$+ > $* $: $2 < @ $3.$4 . > $5 89206f25ae9SGregory Neil Shapiroifdef(`_CANONIFY_HOSTS_', `dnl 89306f25ae9SGregory Neil Shapirodnl this should only apply to unqualified hostnames 89406f25ae9SGregory Neil Shapirodnl but if a valid character inside an unqualified hostname is an OperatorChar 89506f25ae9SGregory Neil Shapirodnl then $- does not work. 89606f25ae9SGregory Neil Shapiro# lookup unqualified hostnames 89706f25ae9SGregory Neil ShapiroR$* $| $* < @ $* > $* $: $2 < @ $[ $3 $] > $4', `dnl')', `dnl 89806f25ae9SGregory Neil Shapirodnl _NO_CANONIFY_ is not set: canonify unless: 89906f25ae9SGregory Neil Shapirodnl {daemon_flags} contains CC (do not canonify) 900193538b7SGregory Neil Shapirodnl but add a trailing dot to qualified hostnames so other rules will work 901193538b7SGregory Neil Shapirodnl should we do this for every hostname: even unqualified? 902193538b7SGregory Neil ShapiroR$* CC $* $| $* < @ $+.$+ > $* $: $3 < @ $4.$5 . > $6 90306f25ae9SGregory Neil ShapiroR$* CC $* $| $* $: $3 90440266059SGregory Neil Shapiroifdef(`_FFR_NOCANONIFY_HEADERS', `dnl 90540266059SGregory Neil Shapiro# do not canonify header addresses 90640266059SGregory Neil ShapiroR$* $| $* < @ $* $~P > $* $: $&{addr_type} $| $2 < @ $3 $4 > $5 90740266059SGregory Neil ShapiroR$* h $* $| $* < @ $+.$+ > $* $: $3 < @ $4.$5 . > $6 90840266059SGregory Neil ShapiroR$* h $* $| $* $: $3', `dnl') 909c2aa98e2SPeter Wemm# pass to name server to make hostname canonical 91006f25ae9SGregory Neil ShapiroR$* $| $* < @ $* > $* $: $2 < @ $[ $3 $] > $4') 91106f25ae9SGregory Neil Shapirodnl remove {daemon_flags} for other cases 91206f25ae9SGregory Neil ShapiroR$* $| $* $: $2 913c2aa98e2SPeter Wemm 914c2aa98e2SPeter Wemm# local host aliases and pseudo-domains are always canonical 915c2aa98e2SPeter WemmR$* < @ $=w > $* $: $1 < @ $2 . > $3 916c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 917c2aa98e2SPeter Wemm`R$* < @ $* $=M > $* $: $1 < @ $2 $3 . > $4', 918c2aa98e2SPeter Wemm`R$* < @ $=M > $* $: $1 < @ $2 . > $3') 91906f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_TABLE_', `dnl 92006f25ae9SGregory Neil Shapirodnl virtual hosts are also canonical 92106f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_ENTIRE_DOMAIN_', 92206f25ae9SGregory Neil Shapiro`R$* < @ $* $={VirtHost} > $* $: $1 < @ $2 $3 . > $4', 92306f25ae9SGregory Neil Shapiro`R$* < @ $={VirtHost} > $* $: $1 < @ $2 . > $3')', 92406f25ae9SGregory Neil Shapiro`dnl') 92540266059SGregory Neil Shapiroifdef(`_GENERICS_TABLE_', `dnl 92640266059SGregory Neil Shapirodnl hosts for genericstable are also canonical 92740266059SGregory Neil Shapiroifdef(`_GENERICS_ENTIRE_DOMAIN_', 92840266059SGregory Neil Shapiro`R$* < @ $* $=G > $* $: $1 < @ $2 $3 . > $4', 92940266059SGregory Neil Shapiro`R$* < @ $=G > $* $: $1 < @ $2 . > $3')', 93040266059SGregory Neil Shapiro`dnl') 93106f25ae9SGregory Neil Shapirodnl remove superfluous dots (maybe repeatedly) which may have been added 93206f25ae9SGregory Neil Shapirodnl by one of the rules before 933c2aa98e2SPeter WemmR$* < @ $* . . > $* $1 < @ $2 . > $3 934c2aa98e2SPeter Wemm 935c2aa98e2SPeter Wemm 936c2aa98e2SPeter Wemm################################################## 937c2aa98e2SPeter Wemm### Ruleset 4 -- Final Output Post-rewriting ### 938c2aa98e2SPeter Wemm################################################## 93906f25ae9SGregory Neil ShapiroSfinal=4 940c2aa98e2SPeter Wemm 941193538b7SGregory Neil ShapiroR$+ :; <@> $@ $1 : handle <list:;> 942c2aa98e2SPeter WemmR$* <@> $@ handle <> and list:; 943c2aa98e2SPeter Wemm 944c2aa98e2SPeter Wemm# strip trailing dot off possibly canonical name 945c2aa98e2SPeter WemmR$* < @ $+ . > $* $1 < @ $2 > $3 946c2aa98e2SPeter Wemm 94706f25ae9SGregory Neil Shapiro# eliminate internal code 948c2aa98e2SPeter WemmR$* < @ *LOCAL* > $* $1 < @ $j > $2 949c2aa98e2SPeter Wemm 950c2aa98e2SPeter Wemm# externalize local domain info 951c2aa98e2SPeter WemmR$* < $+ > $* $1 $2 $3 defocus 952c2aa98e2SPeter WemmR@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical 953c2aa98e2SPeter WemmR@ $* $@ @ $1 ... and exit 954c2aa98e2SPeter Wemm 955c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 956c2aa98e2SPeter Wemm`# UUCP must always be presented in old form 957c2aa98e2SPeter WemmR$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') 958c2aa98e2SPeter Wemm 959c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_', 960c2aa98e2SPeter Wemm`# put DECnet back in :: form 961c2aa98e2SPeter WemmR$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u', 962c2aa98e2SPeter Wemm `dnl') 963c2aa98e2SPeter Wemm# delete duplicate local names 964c2aa98e2SPeter WemmR$+ % $=w @ $=w $1 @ $2 u%host@host => u@host 965c2aa98e2SPeter Wemm 966c2aa98e2SPeter Wemm 967c2aa98e2SPeter Wemm 968c2aa98e2SPeter Wemm############################################################## 969c2aa98e2SPeter Wemm### Ruleset 97 -- recanonicalize and call ruleset zero ### 970c2aa98e2SPeter Wemm### (used for recursive calls) ### 971c2aa98e2SPeter Wemm############################################################## 972c2aa98e2SPeter Wemm 97306f25ae9SGregory Neil ShapiroSRecurse=97 97406f25ae9SGregory Neil ShapiroR$* $: $>canonify $1 97506f25ae9SGregory Neil ShapiroR$* $@ $>parse $1 976c2aa98e2SPeter Wemm 977c2aa98e2SPeter Wemm 978c2aa98e2SPeter Wemm###################################### 979c2aa98e2SPeter Wemm### Ruleset 0 -- Parse Address ### 980c2aa98e2SPeter Wemm###################################### 981c2aa98e2SPeter Wemm 98206f25ae9SGregory Neil ShapiroSparse=0 983c2aa98e2SPeter Wemm 984c2aa98e2SPeter WemmR$* $: $>Parse0 $1 initial parsing 985c2aa98e2SPeter WemmR<@> $#_LOCAL_ $: <@> special case error msgs 98606f25ae9SGregory Neil ShapiroR$* $: $>ParseLocal $1 handle local hacks 987c2aa98e2SPeter WemmR$* $: $>Parse1 $1 final parsing 988c2aa98e2SPeter Wemm 989c2aa98e2SPeter Wemm# 990c2aa98e2SPeter Wemm# Parse0 -- do initial syntax checking and eliminate local addresses. 991c2aa98e2SPeter Wemm# This should either return with the (possibly modified) input 992c2aa98e2SPeter Wemm# or return with a #error mailer. It should not return with a 993c2aa98e2SPeter Wemm# #mailer other than the #error mailer. 994c2aa98e2SPeter Wemm# 995c2aa98e2SPeter Wemm 996c2aa98e2SPeter WemmSParse0 997c2aa98e2SPeter WemmR<@> $@ <@> special case error msgs 99840266059SGregory Neil ShapiroR$* : $* ; <@> $#error $@ 5.1.3 $: "_CODE553 List:; syntax illegal for recipient addresses" 99906f25ae9SGregory Neil ShapiroR@ <@ $* > < @ $1 > catch "@@host" bogosity 100040266059SGregory Neil ShapiroR<@ $+> $#error $@ 5.1.3 $: "_CODE553 User address required" 100140266059SGregory Neil ShapiroR$+ <@> $#error $@ 5.1.3 $: "_CODE553 Hostname required" 1002c2aa98e2SPeter WemmR$* $: <> $1 100340266059SGregory Neil Shapirodnl allow tricks like [host1]:[host2] 100440266059SGregory Neil ShapiroR<> $* < @ [ $* ] : $+ > $* $1 < @ [ $2 ] : $3 > $4 100540266059SGregory Neil ShapiroR<> $* < @ [ $* ] , $+ > $* $1 < @ [ $2 ] , $3 > $4 100640266059SGregory Neil Shapirodnl but no a@[b]c 100740266059SGregory Neil ShapiroR<> $* < @ [ $* ] $+ > $* $#error $@ 5.1.2 $: "_CODE553 Invalid address" 1008c2aa98e2SPeter WemmR<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 100940266059SGregory Neil ShapiroR<> $* <$* : $* > $* $#error $@ 5.1.3 $: "_CODE553 Colon illegal in host name part" 1010c2aa98e2SPeter WemmR<> $* $1 101140266059SGregory Neil ShapiroR$* < @ . $* > $* $#error $@ 5.1.2 $: "_CODE553 Invalid host name" 101240266059SGregory Neil ShapiroR$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "_CODE553 Invalid host name" 101340266059SGregory Neil Shapirodnl no a@b@ 101440266059SGregory Neil ShapiroR$* < @ $* @ > $* $#error $@ 5.1.2 $: "_CODE553 Invalid route address" 101540266059SGregory Neil Shapirodnl no a@b@c 101640266059SGregory Neil ShapiroR$* @ $* < @ $* > $* $#error $@ 5.1.3 $: "_CODE553 Invalid route address" 101706f25ae9SGregory Neil Shapirodnl comma only allowed before @; this check is not complete 101840266059SGregory Neil ShapiroR$* , $~O $* $#error $@ 5.1.3 $: "_CODE553 Invalid route address" 101940266059SGregory Neil Shapiro 102040266059SGregory Neil Shapiroifdef(`_STRICT_RFC821_', `# more RFC 821 checks 102140266059SGregory Neil ShapiroR$* . < @ $* > $* $#error $@ 5.1.2 $: "_CODE553 Local part must not end with a dot" 102240266059SGregory Neil ShapiroR. $* < @ $* > $* $#error $@ 5.1.2 $: "_CODE553 Local part must not begin with a dot" 102340266059SGregory Neil Shapirodnl', `dnl') 1024c2aa98e2SPeter Wemm 1025c2aa98e2SPeter Wemm# now delete the local info -- note $=O to find characters that cause forwarding 102606f25ae9SGregory Neil ShapiroR$* < @ > $* $@ $>Parse0 $>canonify $1 user@ => user 102706f25ae9SGregory Neil ShapiroR< @ $=w . > : $* $@ $>Parse0 $>canonify $2 @here:... -> ... 1028c2aa98e2SPeter WemmR$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here 102940266059SGregory Neil ShapiroR< @ $+ > $#error $@ 5.1.3 $: "_CODE553 User address required" 103006f25ae9SGregory Neil ShapiroR$* $=O $* < @ $=w . > $@ $>Parse0 $>canonify $1 $2 $3 ...@here -> ... 1031c2aa98e2SPeter WemmR$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" 103240266059SGregory Neil ShapiroR< @ *LOCAL* > $#error $@ 5.1.3 $: "_CODE553 User address required" 1033c2aa98e2SPeter WemmR$* $=O $* < @ *LOCAL* > 103406f25ae9SGregory Neil Shapiro $@ $>Parse0 $>canonify $1 $2 $3 ...@*LOCAL* -> ... 1035c2aa98e2SPeter WemmR$* < @ *LOCAL* > $: $1 1036c2aa98e2SPeter Wemm 1037c2aa98e2SPeter Wemm# 1038c2aa98e2SPeter Wemm# Parse1 -- the bottom half of ruleset 0. 1039c2aa98e2SPeter Wemm# 1040c2aa98e2SPeter Wemm 1041c2aa98e2SPeter WemmSParse1 104206f25ae9SGregory Neil Shapiroifdef(`_LDAP_ROUTING_', `dnl 104306f25ae9SGregory Neil Shapiro# handle LDAP routing for hosts in $={LDAPRoute} 104440266059SGregory Neil ShapiroR$+ < @ $={LDAPRoute} . > $: $>LDAPExpand <$1 < @ $2 . >> <$1 @ $2> <> 104540266059SGregory Neil ShapiroR$+ < @ $={LDAPRouteEquiv} . > $: $>LDAPExpand <$1 < @ $2 . >> <$1 @ $M> <>', 1046c2aa98e2SPeter Wemm`dnl') 1047c2aa98e2SPeter Wemm 104806f25ae9SGregory Neil Shapiroifdef(`_MAILER_smtp_', 104906f25ae9SGregory Neil Shapiro`# handle numeric address spec 105006f25ae9SGregory Neil Shapirodnl there is no check whether this is really an IP number 105106f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] > $* $: $>ParseLocal $1 < @ [ $2 ] > $3 numeric internet spec 10525ef517c0SGregory Neil ShapiroR$* < @ [ $+ ] > $* $: $1 < @ [ $2 ] : $S > $3 Add smart host to path 105306f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] : > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 no smarthost: send 105406f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] : $- : $*> $* $#$3 $@ $4 $: $1 < @ [$2] > $5 smarthost with mailer 105506f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] : $+ > $* $#_SMTP_ $@ $3 $: $1 < @ [$2] > $4 smarthost without mailer', 105606f25ae9SGregory Neil Shapiro `dnl') 105706f25ae9SGregory Neil Shapiro 105806f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_TABLE_', `dnl 1059c2aa98e2SPeter Wemm# handle virtual users 106040266059SGregory Neil Shapiroifdef(`_VIRTUSER_STOP_ONE_LEVEL_RECURSION_',`dnl 106140266059SGregory Neil Shapirodnl this is not a documented option 106240266059SGregory Neil Shapirodnl it stops looping in virtusertable mapping if input and output 106340266059SGregory Neil Shapirodnl are identical, i.e., if address A is mapped to A. 106440266059SGregory Neil Shapirodnl it does not deal with multi-level recursion 106540266059SGregory Neil Shapiro# handle full domains in RHS of virtusertable 106640266059SGregory Neil ShapiroR$+ < @ $+ > $: $(macro {RecipientAddress} $) $1 < @ $2 > 106740266059SGregory Neil ShapiroR$+ < @ $+ > $: <?> $1 < @ $2 > $| $>final $1 < @ $2 > 106840266059SGregory Neil ShapiroR<?> $+ $| $+ $: $1 $(macro {RecipientAddress} $@ $2 $) 106940266059SGregory Neil ShapiroR<?> $+ $| $* $: $1', 107040266059SGregory Neil Shapiro`dnl') 107106f25ae9SGregory Neil ShapiroR$+ $: <!> $1 Mark for lookup 107240266059SGregory Neil Shapirodnl input: <!> local<@domain> 107306f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_ENTIRE_DOMAIN_', 107406f25ae9SGregory Neil Shapiro`R<!> $+ < @ $* $={VirtHost} . > $: < $(virtuser $1 @ $2 $3 $@ $1 $: @ $) > $1 < @ $2 $3 . >', 107506f25ae9SGregory Neil Shapiro`R<!> $+ < @ $={VirtHost} . > $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . >') 107640266059SGregory Neil Shapirodnl input: <result-of-lookup | @> local<@domain> | <!> local<@domain> 107706f25ae9SGregory Neil ShapiroR<!> $+ < @ $=w . > $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 107840266059SGregory Neil Shapirodnl if <@> local<@domain>: no match but try lookup 107940266059SGregory Neil Shapirodnl user+detail: try user++@domain if detail not empty 108040266059SGregory Neil ShapiroR<@> $+ + $+ < @ $* . > 108140266059SGregory Neil Shapiro $: < $(virtuser $1 + + @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . > 108240266059SGregory Neil Shapirodnl user+detail: try user+*@domain 1083c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . > 108440266059SGregory Neil Shapiro $: < $(virtuser $1 + * @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . > 108540266059SGregory Neil Shapirodnl user+detail: try user@domain 1086c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . > 108740266059SGregory Neil Shapiro $: < $(virtuser $1 @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . > 108806f25ae9SGregory Neil Shapirodnl try default entry: @domain 108940266059SGregory Neil Shapirodnl ++@domain 109040266059SGregory Neil ShapiroR<@> $+ + $+ < @ $+ . > $: < $(virtuser + + @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . > 109106f25ae9SGregory Neil Shapirodnl +*@domain 109240266059SGregory Neil ShapiroR<@> $+ + $* < @ $+ . > $: < $(virtuser + * @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . > 109306f25ae9SGregory Neil Shapirodnl @domain if +detail exists 109494c01205SGregory Neil Shapirodnl if no match, change marker to prevent a second @domain lookup 109594c01205SGregory Neil ShapiroR<@> $+ + $* < @ $+ . > $: < $(virtuser @ $3 $@ $1 $@ $2 $@ +$2 $: ! $) > $1 + $2 < @ $3 . > 109694c01205SGregory Neil Shapirodnl without +detail 1097c2aa98e2SPeter WemmR<@> $+ < @ $+ . > $: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 109840266059SGregory Neil Shapirodnl no match 1099c2aa98e2SPeter WemmR<@> $+ $: $1 110040266059SGregory Neil Shapirodnl remove mark 110106f25ae9SGregory Neil ShapiroR<!> $+ $: $1 110206f25ae9SGregory Neil ShapiroR< error : $-.$-.$- : $+ > $* $#error $@ $1.$2.$3 $: $4 1103c2aa98e2SPeter WemmR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 110440266059SGregory Neil Shapiroifdef(`_VIRTUSER_STOP_ONE_LEVEL_RECURSION_',`dnl 110540266059SGregory Neil Shapiro# check virtuser input address against output address, if same, skip recursion 110640266059SGregory Neil ShapiroR< $+ > $+ < @ $+ > $: < $1 > $2 < @ $3 > $| $1 110740266059SGregory Neil Shapiro# it is the same: stop now 110840266059SGregory Neil ShapiroR< $+ > $+ < @ $+ > $| $&{RecipientAddress} $: $>ParseLocal $>Parse0 $>canonify $1 110940266059SGregory Neil ShapiroR< $+ > $+ < @ $+ > $| $* $: < $1 > $2 < @ $3 > 111040266059SGregory Neil Shapirodnl', `dnl') 111113058a91SGregory Neil Shapirodnl this is not a documented option 111213058a91SGregory Neil Shapirodnl it performs no looping at all for virtusertable 11138774250cSGregory Neil Shapiroifdef(`_NO_VIRTUSER_RECURSION_', 11148774250cSGregory Neil Shapiro`R< $+ > $+ < @ $+ > $: $>ParseLocal $>Parse0 $>canonify $1', 11158774250cSGregory Neil Shapiro`R< $+ > $+ < @ $+ > $: $>Recurse $1') 11168774250cSGregory Neil Shapirodnl', `dnl') 1117c2aa98e2SPeter Wemm 1118c2aa98e2SPeter Wemm# short circuit local delivery so forwarded email works 1119c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', `dnl 112006f25ae9SGregory Neil ShapiroR$+ . USENET < @ $=w . > $#usenet $@ usenet $: $1 handle usenet specially', `dnl') 112142e5d165SGregory Neil Shapiro 112242e5d165SGregory Neil Shapiro 1123c2aa98e2SPeter Wemmifdef(`_STICKY_LOCAL_DOMAIN_', 1124c2aa98e2SPeter Wemm`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub 112506f25ae9SGregory Neil ShapiroR< $+ > $+ < $+ > $>MailerToTriple < $1 > $2 < $3 > yep .... 112606f25ae9SGregory Neil Shapirodnl $H empty (but @$=w.) 1127c2aa98e2SPeter WemmR< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? 1128c2aa98e2SPeter WemmR< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', 1129c2aa98e2SPeter Wemm`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names 1130c2aa98e2SPeter WemmR$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') 1131c2aa98e2SPeter Wemm 113206f25ae9SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl 1133c2aa98e2SPeter Wemm# not local -- try mailer table lookup 1134c2aa98e2SPeter WemmR$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name 1135c2aa98e2SPeter WemmR< $+ . > $* $: < $1 > $2 strip trailing dot 1136c2aa98e2SPeter WemmR< $+ > $* $: < $(mailertable $1 $) > $2 lookup 113706f25ae9SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses 113806f25ae9SGregory Neil ShapiroR< $~[ : $* > $* $>MailerToTriple < $1 : $2 > $3 check -- resolved? 113906f25ae9SGregory Neil ShapiroR< $+ > $* $: $>Mailertable <$1> $2 try domain', 1140c2aa98e2SPeter Wemm`dnl') 114106f25ae9SGregory Neil Shapiroundivert(4)dnl UUCP rules from `MAILER(uucp)' 1142c2aa98e2SPeter Wemm 1143c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 1144c2aa98e2SPeter Wemm`# resolve remotely connected UUCP links (if any) 1145c2aa98e2SPeter Wemmifdef(`_CLASS_V_', 114606f25ae9SGregory Neil Shapiro`R$* < @ $=V . UUCP . > $* $: $>MailerToTriple < $V > $1 <@$2.UUCP.> $3', 1147c2aa98e2SPeter Wemm `dnl') 1148c2aa98e2SPeter Wemmifdef(`_CLASS_W_', 114906f25ae9SGregory Neil Shapiro`R$* < @ $=W . UUCP . > $* $: $>MailerToTriple < $W > $1 <@$2.UUCP.> $3', 1150c2aa98e2SPeter Wemm `dnl') 1151c2aa98e2SPeter Wemmifdef(`_CLASS_X_', 115206f25ae9SGregory Neil Shapiro`R$* < @ $=X . UUCP . > $* $: $>MailerToTriple < $X > $1 <@$2.UUCP.> $3', 1153c2aa98e2SPeter Wemm `dnl')') 1154c2aa98e2SPeter Wemm 1155c2aa98e2SPeter Wemm# resolve fake top level domains by forwarding to other hosts 1156c2aa98e2SPeter Wemmifdef(`BITNET_RELAY', 115706f25ae9SGregory Neil Shapiro`R$*<@$+.BITNET.>$* $: $>MailerToTriple < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', 1158c2aa98e2SPeter Wemm `dnl') 1159c2aa98e2SPeter Wemmifdef(`DECNET_RELAY', 116006f25ae9SGregory Neil Shapiro`R$*<@$+.DECNET.>$* $: $>MailerToTriple < $C > $1 <@$2.DECNET.> $3 user@host.DECNET', 1161c2aa98e2SPeter Wemm `dnl') 1162c2aa98e2SPeter Wemmifdef(`_MAILER_pop_', 1163c2aa98e2SPeter Wemm`R$+ < @ POP. > $#pop $: $1 user@POP', 1164c2aa98e2SPeter Wemm `dnl') 1165c2aa98e2SPeter Wemmifdef(`_MAILER_fax_', 1166c2aa98e2SPeter Wemm`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', 1167c2aa98e2SPeter Wemm`ifdef(`FAX_RELAY', 116806f25ae9SGregory Neil Shapiro`R$*<@$+.FAX.>$* $: $>MailerToTriple < $F > $1 <@$2.FAX.> $3 user@host.FAX', 1169c2aa98e2SPeter Wemm `dnl')') 1170c2aa98e2SPeter Wemm 1171c2aa98e2SPeter Wemmifdef(`UUCP_RELAY', 1172c2aa98e2SPeter Wemm`# forward non-local UUCP traffic to our UUCP relay 117306f25ae9SGregory Neil ShapiroR$*<@$*.UUCP.>$* $: $>MailerToTriple < $Y > $1 <@$2.UUCP.> $3 uucp mail', 1174c2aa98e2SPeter Wemm`ifdef(`_MAILER_uucp_', 1175c2aa98e2SPeter Wemm`# forward other UUCP traffic straight to UUCP 1176c2aa98e2SPeter WemmR$* < @ $+ .UUCP. > $* $#_UUCP_ $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP', 1177c2aa98e2SPeter Wemm `dnl')') 1178c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', ` 1179c2aa98e2SPeter Wemm# addresses sent to net.group.USENET will get forwarded to a newsgroup 118006f25ae9SGregory Neil ShapiroR$+ . USENET $#usenet $@ usenet $: $1', 1181c2aa98e2SPeter Wemm `dnl') 1182c2aa98e2SPeter Wemm 1183c2aa98e2SPeter Wemmifdef(`_LOCAL_RULES_', 1184c2aa98e2SPeter Wemm`# figure out what should stay in our local mail system 1185c2aa98e2SPeter Wemmundivert(1)', `dnl') 1186c2aa98e2SPeter Wemm 1187c2aa98e2SPeter Wemm# pass names that still have a host to a smarthost (if defined) 118806f25ae9SGregory Neil ShapiroR$* < @ $* > $* $: $>MailerToTriple < $S > $1 < @ $2 > $3 glue on smarthost name 1189c2aa98e2SPeter Wemm 1190c2aa98e2SPeter Wemm# deal with other remote names 1191c2aa98e2SPeter Wemmifdef(`_MAILER_smtp_', 1192c2aa98e2SPeter Wemm`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', 119340266059SGregory Neil Shapiro`R$* < @$* > $* $#error $@ 5.1.2 $: "_CODE553 Unrecognized host name " $2') 1194c2aa98e2SPeter Wemm 1195c2aa98e2SPeter Wemm# handle locally delivered names 1196c2aa98e2SPeter WemmR$=L $#_LOCAL_ $: @ $1 special local names 1197c2aa98e2SPeter WemmR$+ $#_LOCAL_ $: $1 regular local names 1198c2aa98e2SPeter Wemm 1199c2aa98e2SPeter Wemm########################################################################### 1200c2aa98e2SPeter Wemm### Ruleset 5 -- special rewriting after aliases have been expanded ### 1201c2aa98e2SPeter Wemm########################################################################### 1202c2aa98e2SPeter Wemm 120306f25ae9SGregory Neil ShapiroSLocal_localaddr 120406f25ae9SGregory Neil ShapiroSlocaladdr=5 120506f25ae9SGregory Neil ShapiroR$+ $: $1 $| $>"Local_localaddr" $1 120640266059SGregory Neil ShapiroR$+ $| $#ok $@ $1 no change 120706f25ae9SGregory Neil ShapiroR$+ $| $#$* $#$2 120806f25ae9SGregory Neil ShapiroR$+ $| $* $: $1 1209c2aa98e2SPeter Wemm 121040266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl 121140266059SGregory Neil Shapiro# Preserve rcpt_host in {Host} 121240266059SGregory Neil ShapiroR$+ $: $1 $| $&h $| $&{Host} check h and {Host} 121340266059SGregory Neil ShapiroR$+ $| $| $: $(macro {Host} $@ $) $1 no h or {Host} 121440266059SGregory Neil ShapiroR$+ $| $| $+ $: $1 h not set, {Host} set 121540266059SGregory Neil ShapiroR$+ $| +$* $| $* $: $1 h is +detail, {Host} set 12166a2f2ff3SGregory Neil ShapiroR$+ $| $* @ $+ $| $* $: $(macro {Host} $@ @$3 $) $1 set {Host} to host in h 121740266059SGregory Neil ShapiroR$+ $| $+ $| $* $: $(macro {Host} $@ @$2 $) $1 set {Host} to h 121840266059SGregory Neil Shapiro')dnl 121940266059SGregory Neil Shapiro 122040266059SGregory Neil Shapiroifdef(`_FFR_5_', `dnl 122142e5d165SGregory Neil Shapiro# Preserve host in a macro 122242e5d165SGregory Neil ShapiroR$+ $: $(macro {LocalAddrHost} $) $1 122342e5d165SGregory Neil ShapiroR$+ @ $+ $: $(macro {LocalAddrHost} $@ @ $2 $) $1') 1224c2aa98e2SPeter Wemm 122540266059SGregory Neil Shapiroifdef(`_PRESERVE_LOCAL_PLUS_DETAIL_', `', `dnl 122642e5d165SGregory Neil Shapiro# deal with plussed users so aliases work nicely 122742e5d165SGregory Neil ShapiroR$+ + * $#_LOCAL_ $@ $&h $: $1`'ifdef(`_FFR_5_', ` $&{LocalAddrHost}') 122842e5d165SGregory Neil ShapiroR$+ + $* $#_LOCAL_ $@ + $2 $: $1 + *`'ifdef(`_FFR_5_', ` $&{LocalAddrHost}') 122942e5d165SGregory Neil Shapiro') 1230c2aa98e2SPeter Wemm# prepend an empty "forward host" on the front 1231c2aa98e2SPeter WemmR$+ $: <> $1 1232c2aa98e2SPeter Wemm 1233c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl 1234c2aa98e2SPeter Wemm# send unrecognized local users to a relay host 123540266059SGregory Neil Shapiroifdef(`_PRESERVE_LOCAL_PLUS_DETAIL_', `dnl 123642e5d165SGregory Neil ShapiroR< > $+ + $* $: < ? $L > <+ $2> $(user $1 $) look up user+ 123742e5d165SGregory Neil ShapiroR< > $+ $: < ? $L > < > $(user $1 $) look up user 123842e5d165SGregory Neil ShapiroR< ? $* > < $* > $+ <> $: < > $3 $2 found; strip $L 123942e5d165SGregory Neil ShapiroR< ? $* > < $* > $+ $: < $1 > $3 $2 not found', ` 124006f25ae9SGregory Neil ShapiroR< > $+ $: < $L > $(user $1 $) look up user 124140266059SGregory Neil ShapiroR< $* > $+ <> $: < > $2 found; strip $L') 124240266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl 124340266059SGregory Neil ShapiroR< $+ > $+ $: < $1 > $2 $&{Host}') 124440266059SGregory Neil Shapirodnl') 1245c2aa98e2SPeter Wemm 124640266059SGregory Neil Shapiroifdef(`MAIL_HUB', `dnl 124740266059SGregory Neil ShapiroR< > $+ $: < $H > $1 try hub', `dnl') 124840266059SGregory Neil Shapiroifdef(`LOCAL_RELAY', `dnl 124940266059SGregory Neil ShapiroR< > $+ $: < $R > $1 try relay', `dnl') 125040266059SGregory Neil Shapiroifdef(`_PRESERVE_LOCAL_PLUS_DETAIL_', `dnl 125140266059SGregory Neil ShapiroR< > $+ $@ $1', `dnl 125206f25ae9SGregory Neil ShapiroR< > $+ $: < > < $1 <> $&h > nope, restore +detail 125340266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl 125440266059SGregory Neil ShapiroR< > < $+ @ $+ <> + $* > $: < > < $1 + $3 @ $2 > check whether +detail') 125506f25ae9SGregory Neil ShapiroR< > < $+ <> + $* > $: < > < $1 + $2 > check whether +detail 125606f25ae9SGregory Neil ShapiroR< > < $+ <> $* > $: < > < $1 > else discard 1257c2aa98e2SPeter WemmR< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part 125842e5d165SGregory Neil ShapiroR< > < $+ > + $* $#_LOCAL_ $@ $2 $: @ $1`'ifdef(`_FFR_5_', ` $&{LocalAddrHost}') strip the extra + 1259c2aa98e2SPeter WemmR< > < $+ > $@ $1 no +detail 12602e43090eSPeter WemmR$+ $: $1 <> $&h add +detail back in 126140266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl 126240266059SGregory Neil ShapiroR$+ @ $+ <> + $* $: $1 + $3 @ $2 check whether +detail') 12632e43090eSPeter WemmR$+ <> + $* $: $1 + $2 check whether +detail 126442e5d165SGregory Neil ShapiroR$+ <> $* $: $1 else discard') 126506f25ae9SGregory Neil ShapiroR< local : $* > $* $: $>MailerToTriple < local : $1 > $2 no host extension 126606f25ae9SGregory Neil ShapiroR< error : $* > $* $: $>MailerToTriple < error : $1 > $2 no host extension 126740266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl 126840266059SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses 126940266059SGregory Neil ShapiroR< $~[ : $+ > $+ @ $+ $: $>MailerToTriple < $1 : $2 > $3 < @ $4 >') 127040266059SGregory Neil ShapiroR< $~[ : $+ > $+ $: $>MailerToTriple < $1 : $2 > $3 < @ $2 > 127140266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl 127240266059SGregory Neil ShapiroR< $+ > $+ @ $+ $@ $>MailerToTriple < $1 > $2 < @ $3 >') 127306f25ae9SGregory Neil ShapiroR< $+ > $+ $@ $>MailerToTriple < $1 > $2 < @ $1 > 1274c2aa98e2SPeter Wemm 127506f25ae9SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl 127640266059SGregory Neil Shapiroifdef(`_LDAP_ROUTING_', `dnl 127740266059SGregory Neil Shapiro################################################################### 127840266059SGregory Neil Shapiro### Ruleset LDAPMailertable -- mailertable lookup for LDAP ### 127940266059SGregory Neil Shapirodnl input: <Domain> FullAddress 128040266059SGregory Neil Shapiro################################################################### 128140266059SGregory Neil Shapiro 128240266059SGregory Neil ShapiroSLDAPMailertable 128340266059SGregory Neil ShapiroR< $+ > $* $: < $(mailertable $1 $) > $2 lookup 128440266059SGregory Neil ShapiroR< $~[ : $* > $* $>MailerToTriple < $1 : $2 > $3 check resolved? 128540266059SGregory Neil ShapiroR< $+ > $* $: < $1 > $>Mailertable <$1> $2 try domain 128640266059SGregory Neil ShapiroR< $+ > $#$* $#$2 found 128740266059SGregory Neil ShapiroR< $+ > $* $#_RELAY_ $@ $1 $: $2 not found, direct relay', 128840266059SGregory Neil Shapiro`dnl') 128940266059SGregory Neil Shapiro 1290c2aa98e2SPeter Wemm################################################################### 1291c2aa98e2SPeter Wemm### Ruleset 90 -- try domain part of mailertable entry ### 129206f25ae9SGregory Neil Shapirodnl input: LeftPartOfDomain <RightPartOfDomain> FullAddress 1293c2aa98e2SPeter Wemm################################################################### 1294c2aa98e2SPeter Wemm 129506f25ae9SGregory Neil ShapiroSMailertable=90 129606f25ae9SGregory Neil Shapirodnl shift and check 129706f25ae9SGregory Neil Shapirodnl %2 is not documented in cf/README 1298c2aa98e2SPeter WemmR$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 129906f25ae9SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses 130006f25ae9SGregory Neil ShapiroR$* <$~[ : $* > $* $>MailerToTriple < $2 : $3 > $4 check -- resolved? 130106f25ae9SGregory Neil ShapiroR$* < . $+ > $* $@ $>Mailertable $1 . <$2> $3 no -- strip & try again 130206f25ae9SGregory Neil Shapirodnl is $2 always empty? 1303c2aa98e2SPeter WemmR$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." 130406f25ae9SGregory Neil ShapiroR< $~[ : $* > $* $>MailerToTriple < $1 : $2 > $3 "." found? 130506f25ae9SGregory Neil Shapirodnl return full address 1306c2aa98e2SPeter WemmR< $* > $* $@ $2 no mailertable match', 1307c2aa98e2SPeter Wemm`dnl') 1308c2aa98e2SPeter Wemm 1309c2aa98e2SPeter Wemm################################################################### 1310c2aa98e2SPeter Wemm### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### 131106f25ae9SGregory Neil Shapirodnl input: in general: <[mailer:]host> lp<@domain>rest 131206f25ae9SGregory Neil Shapirodnl <> address -> address 131306f25ae9SGregory Neil Shapirodnl <error:d.s.n:text> -> error 1314a7ec597cSGregory Neil Shapirodnl <error:keyword:text> -> error 131506f25ae9SGregory Neil Shapirodnl <error:text> -> error 131606f25ae9SGregory Neil Shapirodnl <mailer:user@host> lp<@domain>rest -> mailer host user 131706f25ae9SGregory Neil Shapirodnl <mailer:host> address -> mailer host address 131806f25ae9SGregory Neil Shapirodnl <localdomain> address -> address 131906f25ae9SGregory Neil Shapirodnl <host> address -> relay host address 1320c2aa98e2SPeter Wemm################################################################### 1321c2aa98e2SPeter Wemm 132206f25ae9SGregory Neil ShapiroSMailerToTriple=95 1323c2aa98e2SPeter WemmR< > $* $@ $1 strip off null relay 132406f25ae9SGregory Neil ShapiroR< error : $-.$-.$- : $+ > $* $#error $@ $1.$2.$3 $: $4 1325a7ec597cSGregory Neil ShapiroR< error : $- : $+ > $* $#error $@ $(dequote $1 $) $: $2 1326a7ec597cSGregory Neil ShapiroR< error : $+ > $* $#error $: $1 1327c2aa98e2SPeter WemmR< local : $* > $* $>CanonLocal < $1 > $2 132840266059SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses 132940266059SGregory Neil ShapiroR< $~[ : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user 133040266059SGregory Neil ShapiroR< $~[ : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer 1331c2aa98e2SPeter WemmR< $=w > $* $@ $2 delete local host 1332c2aa98e2SPeter WemmR< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer 1333c2aa98e2SPeter Wemm 1334c2aa98e2SPeter Wemm################################################################### 1335c2aa98e2SPeter Wemm### Ruleset CanonLocal -- canonify local: syntax ### 133606f25ae9SGregory Neil Shapirodnl input: <user> address 133706f25ae9SGregory Neil Shapirodnl <x> <@host> : rest -> Recurse rest 133806f25ae9SGregory Neil Shapirodnl <x> p1 $=O p2 <@host> -> Recurse p1 $=O p2 133906f25ae9SGregory Neil Shapirodnl <> user <@host> rest -> local user@host user 134006f25ae9SGregory Neil Shapirodnl <> user -> local user user 134106f25ae9SGregory Neil Shapirodnl <user@host> lp <@domain> rest -> <user> lp <@host> [cont] 134206f25ae9SGregory Neil Shapirodnl <user> lp <@host> rest -> local lp@host user 134306f25ae9SGregory Neil Shapirodnl <user> lp -> local lp user 1344c2aa98e2SPeter Wemm################################################################### 1345c2aa98e2SPeter Wemm 1346c2aa98e2SPeter WemmSCanonLocal 13472e43090eSPeter Wemm# strip local host from routed addresses 134806f25ae9SGregory Neil ShapiroR< $* > < @ $+ > : $+ $@ $>Recurse $3 134906f25ae9SGregory Neil ShapiroR< $* > $+ $=O $+ < @ $+ > $@ $>Recurse $2 $3 $4 13502e43090eSPeter Wemm 1351c2aa98e2SPeter Wemm# strip trailing dot from any host name that may appear 1352c2aa98e2SPeter WemmR< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > 1353c2aa98e2SPeter Wemm 1354c2aa98e2SPeter Wemm# handle local: syntax -- use old user, either with or without host 1355c2aa98e2SPeter WemmR< > $* < @ $* > $* $#_LOCAL_ $@ $1@$2 $: $1 1356c2aa98e2SPeter WemmR< > $+ $#_LOCAL_ $@ $1 $: $1 1357c2aa98e2SPeter Wemm 1358c2aa98e2SPeter Wemm# handle local:user@host syntax -- ignore host part 1359c2aa98e2SPeter WemmR< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > 1360c2aa98e2SPeter Wemm 1361c2aa98e2SPeter Wemm# handle local:user syntax 1362c2aa98e2SPeter WemmR< $+ > $* <@ $* > $* $#_LOCAL_ $@ $2@$3 $: $1 1363c2aa98e2SPeter WemmR< $+ > $* $#_LOCAL_ $@ $2 $: $1 1364c2aa98e2SPeter Wemm 1365c2aa98e2SPeter Wemm################################################################### 1366c2aa98e2SPeter Wemm### Ruleset 93 -- convert header names to masqueraded form ### 1367c2aa98e2SPeter Wemm################################################################### 1368c2aa98e2SPeter Wemm 136906f25ae9SGregory Neil ShapiroSMasqHdr=93 1370c2aa98e2SPeter Wemm 137106f25ae9SGregory Neil Shapiroifdef(`_GENERICS_TABLE_', `dnl 1372c2aa98e2SPeter Wemm# handle generics database 1373c2aa98e2SPeter Wemmifdef(`_GENERICS_ENTIRE_DOMAIN_', 137406f25ae9SGregory Neil Shapirodnl if generics should be applied add a @ as mark 1375c2aa98e2SPeter Wemm`R$+ < @ $* $=G . > $: < $1@$2$3 > $1 < @ $2$3 . > @ mark', 1376c2aa98e2SPeter Wemm`R$+ < @ $=G . > $: < $1@$2 > $1 < @ $2 . > @ mark') 1377c2aa98e2SPeter WemmR$+ < @ *LOCAL* > $: < $1@$j > $1 < @ *LOCAL* > @ mark 137806f25ae9SGregory Neil Shapirodnl workspace: either user<@domain> or <user@domain> user <@domain> @ 137906f25ae9SGregory Neil Shapirodnl ignore the first case for now 138006f25ae9SGregory Neil Shapirodnl if it has the mark lookup full address 138140266059SGregory Neil Shapirodnl broken: %1 is full address not just detail 138206f25ae9SGregory Neil ShapiroR< $+ > $+ < $* > @ $: < $(generics $1 $: @ $1 $) > $2 < $3 > 138306f25ae9SGregory Neil Shapirodnl workspace: ... or <match|@user@domain> user <@domain> 138406f25ae9SGregory Neil Shapirodnl no match, try user+detail@domain 138506f25ae9SGregory Neil ShapiroR<@$+ + $* @ $+> $+ < @ $+ > 138606f25ae9SGregory Neil Shapiro $: < $(generics $1+*@$3 $@ $2 $:@$1 + $2@$3 $) > $4 < @ $5 > 138706f25ae9SGregory Neil ShapiroR<@$+ + $* @ $+> $+ < @ $+ > 138806f25ae9SGregory Neil Shapiro $: < $(generics $1@$3 $: $) > $4 < @ $5 > 138906f25ae9SGregory Neil Shapirodnl no match, remove mark 139006f25ae9SGregory Neil ShapiroR<@$+ > $+ < @ $+ > $: < > $2 < @ $3 > 139106f25ae9SGregory Neil Shapirodnl no match, try @domain for exceptions 139206f25ae9SGregory Neil ShapiroR< > $+ < @ $+ . > $: < $(generics @$2 $@ $1 $: $) > $1 < @ $2 . > 139306f25ae9SGregory Neil Shapirodnl workspace: ... or <match> user <@domain> 139406f25ae9SGregory Neil Shapirodnl no match, try local part 1395c2aa98e2SPeter WemmR< > $+ < @ $+ > $: < $(generics $1 $: $) > $1 < @ $2 > 139606f25ae9SGregory Neil ShapiroR< > $+ + $* < @ $+ > $: < $(generics $1+* $@ $2 $: $) > $1 + $2 < @ $3 > 139706f25ae9SGregory Neil ShapiroR< > $+ + $* < @ $+ > $: < $(generics $1 $: $) > $1 + $2 < @ $3 > 139806f25ae9SGregory Neil ShapiroR< $* @ $* > $* < $* > $@ $>canonify $1 @ $2 found qualified 139906f25ae9SGregory Neil ShapiroR< $+ > $* < $* > $: $>canonify $1 @ *LOCAL* found unqualified 1400c2aa98e2SPeter WemmR< > $* $: $1 not found', 1401c2aa98e2SPeter Wemm`dnl') 1402c2aa98e2SPeter Wemm 140306f25ae9SGregory Neil Shapiro# do not masquerade anything in class N 140406f25ae9SGregory Neil ShapiroR$* < @ $* $=N . > $@ $1 < @ $2 $3 . > 140506f25ae9SGregory Neil Shapiro 140640266059SGregory Neil Shapiroifdef(`MASQUERADE_NAME', `dnl 1407c2aa98e2SPeter Wemm# special case the users that should be exposed 1408c2aa98e2SPeter WemmR$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed 1409c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 1410c2aa98e2SPeter Wemm`R$=E < @ $* $=M . > $@ $1 < @ $2 $3 . >', 1411c2aa98e2SPeter Wemm`R$=E < @ $=M . > $@ $1 < @ $2 . >') 1412c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl', 1413c2aa98e2SPeter Wemm`R$=E < @ $=w . > $@ $1 < @ $2 . >') 1414c2aa98e2SPeter Wemm 1415c2aa98e2SPeter Wemm# handle domain-specific masquerading 1416c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 1417c2aa98e2SPeter Wemm`R$* < @ $* $=M . > $* $: $1 < @ $2 $3 . @ $M > $4 convert masqueraded doms', 1418c2aa98e2SPeter Wemm`R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms') 1419c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl', 1420c2aa98e2SPeter Wemm`R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3') 1421c2aa98e2SPeter WemmR$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 1422c2aa98e2SPeter WemmR$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null 1423c2aa98e2SPeter WemmR$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null 142440266059SGregory Neil Shapirodnl', `dnl no masquerading 142540266059SGregory Neil Shapirodnl just fix *LOCAL* leftovers 142640266059SGregory Neil ShapiroR$* < @ *LOCAL* > $@ $1 < @ $j . >') 1427c2aa98e2SPeter Wemm 1428c2aa98e2SPeter Wemm################################################################### 1429c2aa98e2SPeter Wemm### Ruleset 94 -- convert envelope names to masqueraded form ### 1430c2aa98e2SPeter Wemm################################################################### 1431c2aa98e2SPeter Wemm 143206f25ae9SGregory Neil ShapiroSMasqEnv=94 1433c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENVELOPE_', 143406f25ae9SGregory Neil Shapiro`R$+ $@ $>MasqHdr $1', 1435c2aa98e2SPeter Wemm`R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2') 1436c2aa98e2SPeter Wemm 1437c2aa98e2SPeter Wemm################################################################### 1438c2aa98e2SPeter Wemm### Ruleset 98 -- local part of ruleset zero (can be null) ### 1439c2aa98e2SPeter Wemm################################################################### 1440c2aa98e2SPeter Wemm 144106f25ae9SGregory Neil ShapiroSParseLocal=98 144206f25ae9SGregory Neil Shapiroundivert(3)dnl LOCAL_RULE_0 1443c2aa98e2SPeter Wemm 144406f25ae9SGregory Neil Shapiroifdef(`_LDAP_ROUTING_', `dnl 144540266059SGregory Neil Shapiro###################################################################### 144640266059SGregory Neil Shapiro### LDAPExpand: Expand address using LDAP routing 144740266059SGregory Neil Shapiro### 144840266059SGregory Neil Shapiro### Parameters: 144940266059SGregory Neil Shapiro### <$1> -- parsed address (user < @ domain . >) (pass through) 145040266059SGregory Neil Shapiro### <$2> -- RFC822 address (user @ domain) (used for lookup) 145140266059SGregory Neil Shapiro### <$3> -- +detail information 145240266059SGregory Neil Shapiro### 145340266059SGregory Neil Shapiro### Returns: 145440266059SGregory Neil Shapiro### Mailer triplet ($#mailer $@ host $: address) 145540266059SGregory Neil Shapiro### Parsed address (user < @ domain . >) 145640266059SGregory Neil Shapiro###################################################################### 145740266059SGregory Neil Shapiro 1458e92d3f3fSGregory Neil Shapiro# SMTP operation modes 1459e92d3f3fSGregory Neil ShapiroC{SMTPOpModes} s d D 1460e92d3f3fSGregory Neil Shapiro 146106f25ae9SGregory Neil ShapiroSLDAPExpand 146206f25ae9SGregory Neil Shapiro# do the LDAP lookups 146340266059SGregory Neil ShapiroR<$+><$+><$*> $: <$(ldapmra $2 $: $)> <$(ldapmh $2 $: $)> <$1> <$2> <$3> 146406f25ae9SGregory Neil Shapiro 1465e92d3f3fSGregory Neil Shapiro# look for temporary failures and... 1466e92d3f3fSGregory Neil ShapiroR<$* <TMPF>> <$*> <$+> <$+> <$*> $: $&{opMode} $| TMPF <$&{addr_type}> $| $3 1467e92d3f3fSGregory Neil ShapiroR<$*> <$* <TMPF>> <$+> <$+> <$*> $: $&{opMode} $| TMPF <$&{addr_type}> $| $3 1468e92d3f3fSGregory Neil Shapiroifelse(_LDAP_ROUTE_MAPTEMP_, `_TEMPFAIL_', `dnl 1469e92d3f3fSGregory Neil Shapiro# ... temp fail RCPT SMTP commands 1470e92d3f3fSGregory Neil ShapiroR$={SMTPOpModes} $| TMPF <e r> $| $+ $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."') 1471e92d3f3fSGregory Neil Shapiro# ... return original address for MTA to queue up 1472e92d3f3fSGregory Neil ShapiroR$* $| TMPF <$*> $| $+ $@ $3 1473605302a5SGregory Neil Shapiro 147406f25ae9SGregory Neil Shapiro# if mailRoutingAddress and local or non-existant mailHost, 147506f25ae9SGregory Neil Shapiro# return the new mailRoutingAddress 147640266059SGregory Neil Shapiroifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl 147740266059SGregory Neil ShapiroR<$+@$+> <$=w> <$+> <$+> <$*> $@ $>Parse0 $>canonify $1 $6 @ $2 147840266059SGregory Neil ShapiroR<$+@$+> <> <$+> <$+> <$*> $@ $>Parse0 $>canonify $1 $5 @ $2') 147940266059SGregory Neil ShapiroR<$+> <$=w> <$+> <$+> <$*> $@ $>Parse0 $>canonify $1 148040266059SGregory Neil ShapiroR<$+> <> <$+> <$+> <$*> $@ $>Parse0 $>canonify $1 148106f25ae9SGregory Neil Shapiro 148294c01205SGregory Neil Shapiro 148306f25ae9SGregory Neil Shapiro# if mailRoutingAddress and non-local mailHost, 148406f25ae9SGregory Neil Shapiro# relay to mailHost with new mailRoutingAddress 148540266059SGregory Neil Shapiroifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl 148640266059SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl 148740266059SGregory Neil Shapiro# check mailertable for host, relay from there 148840266059SGregory Neil ShapiroR<$+@$+> <$+> <$+> <$+> <$*> $>LDAPMailertable <$3> $>canonify $1 $6 @ $2', 148940266059SGregory Neil Shapiro`R<$+@$+> <$+> <$+> <$+> <$*> $#_RELAY_ $@ $3 $: $>canonify $1 $6 @ $2')') 149040266059SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl 149140266059SGregory Neil Shapiro# check mailertable for host, relay from there 149240266059SGregory Neil ShapiroR<$+> <$+> <$+> <$+> <$*> $>LDAPMailertable <$2> $>canonify $1', 149340266059SGregory Neil Shapiro`R<$+> <$+> <$+> <$+> <$*> $#_RELAY_ $@ $2 $: $>canonify $1') 149406f25ae9SGregory Neil Shapiro 149506f25ae9SGregory Neil Shapiro# if no mailRoutingAddress and local mailHost, 149606f25ae9SGregory Neil Shapiro# return original address 149740266059SGregory Neil ShapiroR<> <$=w> <$+> <$+> <$*> $@ $2 149806f25ae9SGregory Neil Shapiro 149994c01205SGregory Neil Shapiro 150006f25ae9SGregory Neil Shapiro# if no mailRoutingAddress and non-local mailHost, 150106f25ae9SGregory Neil Shapiro# relay to mailHost with original address 150240266059SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl 150340266059SGregory Neil Shapiro# check mailertable for host, relay from there 150440266059SGregory Neil ShapiroR<> <$+> <$+> <$+> <$*> $>LDAPMailertable <$1> $2', 150540266059SGregory Neil Shapiro`R<> <$+> <$+> <$+> <$*> $#_RELAY_ $@ $1 $: $2') 150606f25ae9SGregory Neil Shapiro 150740266059SGregory Neil Shapiroifdef(`_LDAP_ROUTE_DETAIL_', 150840266059SGregory Neil Shapiro`# if no mailRoutingAddress and no mailHost, 150940266059SGregory Neil Shapiro# try without +detail 151040266059SGregory Neil ShapiroR<> <> <$+> <$+ + $* @ $+> <> $@ $>LDAPExpand <$1> <$2 @ $4> <+$3>')dnl 151140266059SGregory Neil Shapiro 1512e92d3f3fSGregory Neil Shapiroifdef(`_LDAP_ROUTE_NODOMAIN_', `dnl', ` 151340266059SGregory Neil Shapiro# if still no mailRoutingAddress and no mailHost, 151406f25ae9SGregory Neil Shapiro# try @domain 151540266059SGregory Neil Shapiroifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl 151640266059SGregory Neil ShapiroR<> <> <$+> <$+ + $* @ $+> <> $@ $>LDAPExpand <$1> <@ $4> <+$3>') 1517e92d3f3fSGregory Neil ShapiroR<> <> <$+> <$+ @ $+> <$*> $@ $>LDAPExpand <$1> <@ $3> <$4>') 151806f25ae9SGregory Neil Shapiro 151906f25ae9SGregory Neil Shapiro# if no mailRoutingAddress and no mailHost and this was a domain attempt, 152006f25ae9SGregory Neil Shapiroifelse(_LDAP_ROUTING_, `_MUST_EXIST_', `dnl 152106f25ae9SGregory Neil Shapiro# user does not exist 152240266059SGregory Neil ShapiroR<> <> <$+> <@ $+> <$*> $: <?> < $&{addr_type} > < $1 > 152340266059SGregory Neil Shapiro# only give error for envelope recipient 152440266059SGregory Neil ShapiroR<?> <e r> <$+> $#error $@ nouser $: "550 User unknown" 1525e92d3f3fSGregory Neil Shapiroifdef(`_LDAP_SENDER_MUST_EXIST_', `dnl 1526e92d3f3fSGregory Neil Shapiro# and the sender too 1527e92d3f3fSGregory Neil ShapiroR<?> <e s> <$+> $#error $@ nouser $: "550 User unknown"') 152840266059SGregory Neil ShapiroR<?> <$*> <$+> $@ $2', 152906f25ae9SGregory Neil Shapiro`dnl 153006f25ae9SGregory Neil Shapiro# return the original address 153140266059SGregory Neil ShapiroR<> <> <$+> <@ $+> <$*> $@ $1')', 153206f25ae9SGregory Neil Shapiro`dnl') 153306f25ae9SGregory Neil Shapiro 153406f25ae9SGregory Neil Shapiroifelse(substr(confDELIVERY_MODE,0,1), `d', `errprint(`WARNING: Antispam rules not available in deferred delivery mode. 153506f25ae9SGregory Neil Shapiro')') 153640266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl', `divert(-1)') 1537c2aa98e2SPeter Wemm###################################################################### 153840266059SGregory Neil Shapiro### D: LookUpDomain -- search for domain in access database 1539c2aa98e2SPeter Wemm### 1540c2aa98e2SPeter Wemm### Parameters: 1541c2aa98e2SPeter Wemm### <$1> -- key (domain name) 1542c2aa98e2SPeter Wemm### <$2> -- default (what to return if not found in db) 154306f25ae9SGregory Neil Shapirodnl must not be empty 154440266059SGregory Neil Shapiro### <$3> -- mark (must be <(!|+) single-token>) 154506f25ae9SGregory Neil Shapiro### ! does lookup only with tag 154606f25ae9SGregory Neil Shapiro### + does lookup with and without tag 154740266059SGregory Neil Shapiro### <$4> -- passthru (additional data passed unchanged through) 154806f25ae9SGregory Neil Shapirodnl returns: <default> <passthru> 154906f25ae9SGregory Neil Shapirodnl <result> <passthru> 1550c2aa98e2SPeter Wemm###################################################################### 1551c2aa98e2SPeter Wemm 155240266059SGregory Neil ShapiroSD 155306f25ae9SGregory Neil Shapirodnl workspace <key> <default> <passthru> <mark> 155406f25ae9SGregory Neil Shapirodnl lookup with tag (in front, no delimiter here) 155540266059SGregory Neil Shapirodnl 2 3 4 5 155640266059SGregory Neil ShapiroR<$*> <$+> <$- $-> <$*> $: < $(access $4`'_TAG_DELIM_`'$1 $: ? $) > <$1> <$2> <$3 $4> <$5> 155706f25ae9SGregory Neil Shapirodnl workspace <result-of-lookup|?> <key> <default> <passthru> <mark> 155806f25ae9SGregory Neil Shapirodnl lookup without tag? 155940266059SGregory Neil Shapirodnl 1 2 3 4 156040266059SGregory Neil ShapiroR<?> <$+> <$+> <+ $-> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <+ $3> <$4> 156140266059SGregory Neil Shapiroifdef(`_LOOKUPDOTDOMAIN_', `dnl omit first component: lookup .rest 156240266059SGregory Neil Shapirodnl XXX apply this also to IP addresses? 156340266059SGregory Neil Shapirodnl currently it works the wrong way round for [1.2.3.4] 156440266059SGregory Neil Shapirodnl 1 2 3 4 5 6 156540266059SGregory Neil ShapiroR<?> <$+.$+> <$+> <$- $-> <$*> $: < $(access $5`'_TAG_DELIM_`'.$2 $: ? $) > <$1.$2> <$3> <$4 $5> <$6> 156640266059SGregory Neil Shapirodnl 1 2 3 4 5 156740266059SGregory Neil ShapiroR<?> <$+.$+> <$+> <+ $-> <$*> $: < $(access .$2 $: ? $) > <$1.$2> <$3> <+ $4> <$5>', `dnl') 156840266059SGregory Neil Shapiroifdef(`_ACCESS_SKIP_', `dnl 156940266059SGregory Neil Shapirodnl found SKIP: return <default> and <passthru> 157040266059SGregory Neil Shapirodnl 1 2 3 4 5 157140266059SGregory Neil ShapiroR<SKIP> <$+> <$+> <$- $-> <$*> $@ <$2> <$5>', `dnl') 157240266059SGregory Neil Shapirodnl not found: IPv4 net (no check is done whether it is an IP number!) 157340266059SGregory Neil Shapirodnl 1 2 3 4 5 6 157440266059SGregory Neil ShapiroR<?> <[$+.$-]> <$+> <$- $-> <$*> $@ $>D <[$1]> <$3> <$4 $5> <$6> 157540266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl', 157640266059SGregory Neil Shapiro`dnl not found: IPv6 net 157740266059SGregory Neil Shapirodnl (could be merged with previous rule if we have a class containing .:) 157840266059SGregory Neil Shapirodnl 1 2 3 4 5 6 157940266059SGregory Neil ShapiroR<?> <[$+::$-]> <$+> <$- $-> <$*> $: $>D <[$1]> <$3> <$4 $5> <$6> 158040266059SGregory Neil ShapiroR<?> <[$+:$-]> <$+> <$- $-> <$*> $: $>D <[$1]> <$3> <$4 $5> <$6>') 158106f25ae9SGregory Neil Shapirodnl not found, but subdomain: try again 158240266059SGregory Neil Shapirodnl 1 2 3 4 5 6 158340266059SGregory Neil ShapiroR<?> <$+.$+> <$+> <$- $-> <$*> $@ $>D <$2> <$3> <$4 $5> <$6> 158440266059SGregory Neil Shapiroifdef(`_FFR_LOOKUPTAG_', `dnl lookup Tag: 158540266059SGregory Neil Shapirodnl 1 2 3 4 158640266059SGregory Neil ShapiroR<?> <$+> <$+> <! $-> <$*> $: < $(access $3`'_TAG_DELIM_ $: ? $) > <$1> <$2> <! $3> <$4>', `dnl') 158740266059SGregory Neil Shapirodnl not found, no subdomain: return <default> and <passthru> 158840266059SGregory Neil Shapirodnl 1 2 3 4 5 158940266059SGregory Neil ShapiroR<?> <$+> <$+> <$- $-> <$*> $@ <$2> <$5> 159040266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 159140266059SGregory Neil Shapirodnl 2 3 4 5 6 159240266059SGregory Neil ShapiroR<$* _ATMPF_> <$+> <$+> <$- $-> <$*> $@ <_ATMPF_> <$6>', `dnl') 159340266059SGregory Neil Shapirodnl return <result of lookup> and <passthru> 159440266059SGregory Neil Shapirodnl 2 3 4 5 6 159540266059SGregory Neil ShapiroR<$*> <$+> <$+> <$- $-> <$*> $@ <$1> <$6> 1596c2aa98e2SPeter Wemm 1597c2aa98e2SPeter Wemm###################################################################### 159840266059SGregory Neil Shapiro### A: LookUpAddress -- search for host address in access database 1599c2aa98e2SPeter Wemm### 1600c2aa98e2SPeter Wemm### Parameters: 1601c2aa98e2SPeter Wemm### <$1> -- key (dot quadded host address) 1602c2aa98e2SPeter Wemm### <$2> -- default (what to return if not found in db) 160306f25ae9SGregory Neil Shapirodnl must not be empty 160440266059SGregory Neil Shapiro### <$3> -- mark (must be <(!|+) single-token>) 160506f25ae9SGregory Neil Shapiro### ! does lookup only with tag 160606f25ae9SGregory Neil Shapiro### + does lookup with and without tag 160740266059SGregory Neil Shapiro### <$4> -- passthru (additional data passed through) 160806f25ae9SGregory Neil Shapirodnl returns: <default> <passthru> 160906f25ae9SGregory Neil Shapirodnl <result> <passthru> 1610c2aa98e2SPeter Wemm###################################################################### 1611c2aa98e2SPeter Wemm 161240266059SGregory Neil ShapiroSA 161306f25ae9SGregory Neil Shapirodnl lookup with tag 161440266059SGregory Neil Shapirodnl 2 3 4 5 161540266059SGregory Neil ShapiroR<$+> <$+> <$- $-> <$*> $: < $(access $4`'_TAG_DELIM_`'$1 $: ? $) > <$1> <$2> <$3 $4> <$5> 161606f25ae9SGregory Neil Shapirodnl lookup without tag 161740266059SGregory Neil Shapirodnl 1 2 3 4 161840266059SGregory Neil ShapiroR<?> <$+> <$+> <+ $-> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <+ $3> <$4> 161940266059SGregory Neil Shapirodnl workspace <result-of-lookup|?> <key> <default> <mark> <passthru> 162040266059SGregory Neil Shapiroifdef(`_ACCESS_SKIP_', `dnl 162140266059SGregory Neil Shapirodnl found SKIP: return <default> and <passthru> 162240266059SGregory Neil Shapirodnl 1 2 3 4 5 162340266059SGregory Neil ShapiroR<SKIP> <$+> <$+> <$- $-> <$*> $@ <$2> <$5>', `dnl') 162440266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl', 162540266059SGregory Neil Shapiro`dnl no match; IPv6: remove last part 162640266059SGregory Neil Shapirodnl 1 2 3 4 5 6 162740266059SGregory Neil ShapiroR<?> <$+::$-> <$+> <$- $-> <$*> $@ $>A <$1> <$3> <$4 $5> <$6> 162840266059SGregory Neil ShapiroR<?> <$+:$-> <$+> <$- $-> <$*> $@ $>A <$1> <$3> <$4 $5> <$6>') 162906f25ae9SGregory Neil Shapirodnl no match; IPv4: remove last part 163040266059SGregory Neil Shapirodnl 1 2 3 4 5 6 163140266059SGregory Neil ShapiroR<?> <$+.$-> <$+> <$- $-> <$*> $@ $>A <$1> <$3> <$4 $5> <$6> 163206f25ae9SGregory Neil Shapirodnl no match: return default 163340266059SGregory Neil Shapirodnl 1 2 3 4 5 163440266059SGregory Neil ShapiroR<?> <$+> <$+> <$- $-> <$*> $@ <$2> <$5> 163540266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 163640266059SGregory Neil Shapirodnl 2 3 4 5 6 163740266059SGregory Neil ShapiroR<$* _ATMPF_> <$+> <$+> <$- $-> <$*> $@ <_ATMPF_> <$6>', `dnl') 163806f25ae9SGregory Neil Shapirodnl match: return result 163940266059SGregory Neil Shapirodnl 2 3 4 5 6 164040266059SGregory Neil ShapiroR<$*> <$+> <$+> <$- $-> <$*> $@ <$1> <$6> 164140266059SGregory Neil Shapirodnl endif _ACCESS_TABLE_ 164240266059SGregory Neil Shapirodivert(0) 1643c2aa98e2SPeter Wemm###################################################################### 1644065a643dSPeter Wemm### CanonAddr -- Convert an address into a standard form for 1645065a643dSPeter Wemm### relay checking. Route address syntax is 1646065a643dSPeter Wemm### crudely converted into a %-hack address. 1647065a643dSPeter Wemm### 1648065a643dSPeter Wemm### Parameters: 1649065a643dSPeter Wemm### $1 -- full recipient address 1650065a643dSPeter Wemm### 1651065a643dSPeter Wemm### Returns: 1652065a643dSPeter Wemm### parsed address, not in source route form 165306f25ae9SGregory Neil Shapirodnl user%host%host<@domain> 165406f25ae9SGregory Neil Shapirodnl host!user<@domain> 1655065a643dSPeter Wemm###################################################################### 1656065a643dSPeter Wemm 1657065a643dSPeter WemmSCanonAddr 165806f25ae9SGregory Neil ShapiroR$* $: $>Parse0 $>canonify $1 make domain canonical 165906f25ae9SGregory Neil Shapiroifdef(`_USE_DEPRECATED_ROUTE_ADDR_',`dnl 1660065a643dSPeter WemmR< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route 1661065a643dSPeter WemmR$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. 1662065a643dSPeter WemmR$* < @ $+ > : $* $3 $1 < @ $2 > 166306f25ae9SGregory Neil Shapirodnl') 1664065a643dSPeter Wemm 1665065a643dSPeter Wemm###################################################################### 1666c2aa98e2SPeter Wemm### ParseRecipient -- Strip off hosts in $=R as well as possibly 1667c2aa98e2SPeter Wemm### $* $=m or the access database. 1668c2aa98e2SPeter Wemm### Check user portion for host separators. 1669c2aa98e2SPeter Wemm### 1670c2aa98e2SPeter Wemm### Parameters: 1671c2aa98e2SPeter Wemm### $1 -- full recipient address 1672c2aa98e2SPeter Wemm### 1673c2aa98e2SPeter Wemm### Returns: 1674c2aa98e2SPeter Wemm### parsed, non-local-relaying address 1675c2aa98e2SPeter Wemm###################################################################### 1676c2aa98e2SPeter Wemm 1677c2aa98e2SPeter WemmSParseRecipient 167806f25ae9SGregory Neil Shapirodnl mark and canonify address 1679065a643dSPeter WemmR$* $: <?> $>CanonAddr $1 168006f25ae9SGregory Neil Shapirodnl workspace: <?> localpart<@domain[.]> 1681c2aa98e2SPeter WemmR<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots 168206f25ae9SGregory Neil Shapirodnl workspace: <?> localpart<@domain> 1683c2aa98e2SPeter WemmR<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part 1684c2aa98e2SPeter Wemm 1685c2aa98e2SPeter Wemm# if no $=O character, no host in the user portion, we are done 1686c2aa98e2SPeter WemmR<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> 168706f25ae9SGregory Neil Shapirodnl no $=O in localpart: return 1688c2aa98e2SPeter WemmR<?> $* $@ $1 1689c2aa98e2SPeter Wemm 169040266059SGregory Neil Shapirodnl workspace: <NO> localpart<@domain>, where localpart contains $=O 169106f25ae9SGregory Neil Shapirodnl mark everything which has an "authorized" domain with <RELAY> 1692c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1693c2aa98e2SPeter Wemm# if we relay, check username portion for user%host so host can be checked also 1694c2aa98e2SPeter WemmR<NO> $* < @ $* $=m > $: <RELAY> $1 < @ $2 $3 >', `dnl') 169506f25ae9SGregory Neil Shapirodnl workspace: <(NO|RELAY)> localpart<@domain>, where localpart contains $=O 169606f25ae9SGregory Neil Shapirodnl if mark is <NO> then change it to <RELAY> if domain is "authorized" 169740266059SGregory Neil Shapiro 169840266059SGregory Neil Shapirodnl what if access map returns something else than RELAY? 169940266059SGregory Neil Shapirodnl we are only interested in RELAY entries... 170040266059SGregory Neil Shapirodnl other To: entries: blacklist recipient; generic entries? 170140266059SGregory Neil Shapirodnl if it is an error we probably do not want to relay anyway 1702c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1703c2aa98e2SPeter Wemm`R<NO> $* < @ $=R > $: <RELAY> $1 < @ $2 > 170406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 170506f25ae9SGregory Neil ShapiroR<NO> $* < @ $+ > $: <$(access To:$2 $: NO $)> $1 < @ $2 > 1706065a643dSPeter WemmR<NO> $* < @ $+ > $: <$(access $2 $: NO $)> $1 < @ $2 >',`dnl')', 1707c2aa98e2SPeter Wemm`R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > 170806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 170940266059SGregory Neil ShapiroR<NO> $* < @ $+ > $: $>D <$2> <NO> <+ To> <$1 < @ $2 >> 1710c2aa98e2SPeter WemmR<$+> <$+> $: <$1> $2',`dnl')') 1711065a643dSPeter Wemm 171206f25ae9SGregory Neil Shapiro 171340266059SGregory Neil Shapiroifdef(`_RELAY_MX_SERVED_', `dnl 171440266059SGregory Neil Shapirodnl do "we" ($=w) act as backup MX server for the destination domain? 171540266059SGregory Neil ShapiroR<NO> $* < @ $+ > $: <MX> < : $(mxserved $2 $) : > < $1 < @$2 > > 1716e92d3f3fSGregory Neil ShapiroR<MX> < : $* <TEMP> : > $* $#TEMP $@ 4.4.0 $: "450 Can not check MX records for recipient host " $1 171740266059SGregory Neil Shapirodnl yes: mark it as <RELAY> 171840266059SGregory Neil ShapiroR<MX> < $* : $=w. : $* > < $+ > $: <RELAY> $4 171940266059SGregory Neil Shapirodnl no: put old <NO> mark back 172040266059SGregory Neil ShapiroR<MX> < : $* : > < $+ > $: <NO> $2', `dnl') 172140266059SGregory Neil Shapiro 172240266059SGregory Neil Shapirodnl do we relay to this recipient domain? 1723c2aa98e2SPeter WemmR<RELAY> $* < @ $* > $@ $>ParseRecipient $1 172440266059SGregory Neil Shapirodnl something else 172540266059SGregory Neil ShapiroR<$+> $* $@ $2 1726c2aa98e2SPeter Wemm 172706f25ae9SGregory Neil Shapiro 1728c2aa98e2SPeter Wemm###################################################################### 1729c2aa98e2SPeter Wemm### check_relay -- check hostname/address on SMTP startup 1730c2aa98e2SPeter Wemm###################################################################### 1731c2aa98e2SPeter Wemm 1732e92d3f3fSGregory Neil Shapiroifdef(`_CONTROL_IMMEDIATE_',`dnl 1733e92d3f3fSGregory Neil ShapiroScheck_relay 1734e92d3f3fSGregory Neil Shapiroifdef(`_RATE_CONTROL_IMMEDIATE_',`dnl 1735e92d3f3fSGregory Neil Shapirodnl workspace: ignored... 1736e92d3f3fSGregory Neil ShapiroR$* $: $>"RateControl" dummy', `dnl') 1737e92d3f3fSGregory Neil Shapiroifdef(`_CONN_CONTROL_IMMEDIATE_',`dnl 1738e92d3f3fSGregory Neil Shapirodnl workspace: ignored... 1739e92d3f3fSGregory Neil ShapiroR$* $: $>"ConnControl" dummy', `dnl') 1740e92d3f3fSGregory Neil Shapirodnl') 1741e92d3f3fSGregory Neil Shapiro 1742c2aa98e2SPeter WemmSLocal_check_relay 174306f25ae9SGregory Neil ShapiroScheck`'_U_`'relay 1744e92d3f3fSGregory Neil Shapiroifdef(`_USE_CLIENT_PTR_',`dnl 1745e92d3f3fSGregory Neil ShapiroR$* $| $* $: $&{client_ptr} $| $2', `dnl') 1746c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_relay" $1 1747c2aa98e2SPeter WemmR$* $| $* $| $#$* $#$3 1748c2aa98e2SPeter WemmR$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 1749c2aa98e2SPeter Wemm 1750c2aa98e2SPeter WemmSBasic_check_relay 1751c2aa98e2SPeter Wemm# check for deferred delivery mode 175294c01205SGregory Neil ShapiroR$* $: < $&{deliveryMode} > $1 1753c2aa98e2SPeter WemmR< d > $* $@ deferred 1754c2aa98e2SPeter WemmR< $* > $* $: $2 1755c2aa98e2SPeter Wemm 175606f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 175742e5d165SGregory Neil Shapirodnl workspace: {client_name} $| {client_addr} 175840266059SGregory Neil ShapiroR$+ $| $+ $: $>D < $1 > <?> <+ Connect> < $2 > 175942e5d165SGregory Neil Shapirodnl workspace: <result-of-lookup> <{client_addr}> 176013bd1963SGregory Neil Shapirodnl OR $| $+ if client_name is empty 176113bd1963SGregory Neil ShapiroR $| $+ $: $>A < $1 > <?> <+ Connect> <> empty client_name 176213bd1963SGregory Neil Shapirodnl workspace: <result-of-lookup> <{client_addr}> 176340266059SGregory Neil ShapiroR<?> <$+> $: $>A < $1 > <?> <+ Connect> <> no: another lookup 176440266059SGregory Neil Shapirodnl workspace: <result-of-lookup> (<>|<{client_addr}>) 176540266059SGregory Neil ShapiroR<?> <$*> $: OK found nothing 176640266059SGregory Neil Shapirodnl workspace: <result-of-lookup> (<>|<{client_addr}>) | OK 176742e5d165SGregory Neil ShapiroR<$={Accept}> <$*> $@ $1 return value of lookup 1768e92d3f3fSGregory Neil ShapiroR<REJECT> <$*> $#error ifdef(`confREJECT_MSG', `$: confREJECT_MSG', `$@ 5.7.1 $: "550 Access denied"') 176940266059SGregory Neil ShapiroR<DISCARD> <$*> $#discard $: discard 1770e92d3f3fSGregory Neil ShapiroR<QUARANTINE:$+> <$*> $#error $@ quarantine $: $1 177106f25ae9SGregory Neil Shapirodnl error tag 177242e5d165SGregory Neil ShapiroR<ERROR:$-.$-.$-:$+> <$*> $#error $@ $1.$2.$3 $: $4 177342e5d165SGregory Neil ShapiroR<ERROR:$+> <$*> $#error $: $1 177440266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<$* _ATMPF_> <$*> $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 177506f25ae9SGregory Neil Shapirodnl generic error from access map 177642e5d165SGregory Neil ShapiroR<$+> <$*> $#error $: $1', `dnl') 1777c2aa98e2SPeter Wemm 1778c2aa98e2SPeter Wemmifdef(`_RBL_',`dnl 177906f25ae9SGregory Neil Shapiro# DNS based IP address spam list 178040266059SGregory Neil Shapirodnl workspace: ignored... 1781c2aa98e2SPeter WemmR$* $: $&{client_addr} 178206f25ae9SGregory Neil ShapiroR$-.$-.$-.$- $: <?> $(host $4.$3.$2.$1._RBL_. $: OK $) 178306f25ae9SGregory Neil ShapiroR<?>OK $: OKSOFAR 178494c01205SGregory Neil ShapiroR<?>$+ $#error $@ 5.7.1 $: "550 Rejected: " $&{client_addr} " listed at _RBL_"', 1785c2aa98e2SPeter Wemm`dnl') 1786e92d3f3fSGregory Neil Shapiroifdef(`_RATE_CONTROL_',`dnl 1787e92d3f3fSGregory Neil Shapiroifdef(`_RATE_CONTROL_IMMEDIATE_',`', `dnl 1788e92d3f3fSGregory Neil Shapirodnl workspace: ignored... 1789e92d3f3fSGregory Neil ShapiroR$* $: $>"RateControl" dummy')', `dnl') 1790e92d3f3fSGregory Neil Shapiroifdef(`_CONN_CONTROL_',`dnl 1791e92d3f3fSGregory Neil Shapiroifdef(`_CONN_CONTROL_IMMEDIATE_',`',`dnl 1792e92d3f3fSGregory Neil Shapirodnl workspace: ignored... 1793e92d3f3fSGregory Neil ShapiroR$* $: $>"ConnControl" dummy')', `dnl') 179406f25ae9SGregory Neil Shapiroundivert(8) 1795d0cef73dSGregory Neil Shapiroifdef(`_REQUIRE_RDNS_', `dnl 1796d0cef73dSGregory Neil ShapiroR$* $: $&{client_addr} $| $&{client_resolve} 1797d0cef73dSGregory Neil ShapiroR$=R $* $@ RELAY We relay for these 1798d0cef73dSGregory Neil ShapiroR$* $| OK $@ OK Resolves. 1799d0cef73dSGregory Neil ShapiroR$* $| FAIL $#error $@ 5.7.1 $: 550 Fix reverse DNS for $1 1800d0cef73dSGregory Neil ShapiroR$* $| TEMP $#error $@ 4.1.8 $: 451 Client IP address $1 does not resolve 1801d0cef73dSGregory Neil ShapiroR$* $| FORGED $#error $@ 4.1.8 $: 451 Possibly forged hostname for $1 1802d0cef73dSGregory Neil Shapiro', `dnl') 1803c2aa98e2SPeter Wemm 1804c2aa98e2SPeter Wemm###################################################################### 1805c2aa98e2SPeter Wemm### check_mail -- check SMTP ``MAIL FROM:'' command argument 1806c2aa98e2SPeter Wemm###################################################################### 1807c2aa98e2SPeter Wemm 1808c2aa98e2SPeter WemmSLocal_check_mail 180906f25ae9SGregory Neil ShapiroScheck`'_U_`'mail 1810c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_mail" $1 1811c2aa98e2SPeter WemmR$* $| $#$* $#$2 1812c2aa98e2SPeter WemmR$* $| $* $@ $>"Basic_check_mail" $1 1813c2aa98e2SPeter Wemm 1814c2aa98e2SPeter WemmSBasic_check_mail 1815c2aa98e2SPeter Wemm# check for deferred delivery mode 181694c01205SGregory Neil ShapiroR$* $: < $&{deliveryMode} > $1 1817c2aa98e2SPeter WemmR< d > $* $@ deferred 1818c2aa98e2SPeter WemmR< $* > $* $: $2 1819c2aa98e2SPeter Wemm 182006f25ae9SGregory Neil Shapiro# authenticated? 182106f25ae9SGregory Neil Shapirodnl done first: we can require authentication for every mail transaction 182206f25ae9SGregory Neil Shapirodnl workspace: address as given by MAIL FROM: (sender) 182306f25ae9SGregory Neil ShapiroR$* $: $1 $| $>"tls_client" $&{verify} $| MAIL 182406f25ae9SGregory Neil ShapiroR$* $| $#$+ $#$2 182506f25ae9SGregory Neil Shapirodnl undo damage: remove result of tls_client call 182606f25ae9SGregory Neil ShapiroR$* $| $* $: $1 182706f25ae9SGregory Neil Shapiro 182806f25ae9SGregory Neil Shapirodnl workspace: address as given by MAIL FROM: 182906f25ae9SGregory Neil ShapiroR<> $@ <OK> we MUST accept <> (RFC 1123) 183006f25ae9SGregory Neil Shapiroifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 183106f25ae9SGregory Neil Shapirodnl do some additional checks 183206f25ae9SGregory Neil Shapirodnl no user@host 183306f25ae9SGregory Neil Shapirodnl no user@localhost (if nonlocal sender) 183406f25ae9SGregory Neil Shapirodnl this is a pretty simple canonification, it will not catch every case 183506f25ae9SGregory Neil Shapirodnl just make sure the address has <> around it (which is required by 183606f25ae9SGregory Neil Shapirodnl the RFC anyway, maybe we should complain if they are missing...) 183706f25ae9SGregory Neil Shapirodnl dirty trick: if it is user@host, just add a dot: user@host. this will 183806f25ae9SGregory Neil Shapirodnl not be modified by host lookups. 183906f25ae9SGregory Neil ShapiroR$+ $: <?> $1 184006f25ae9SGregory Neil ShapiroR<?><$+> $: <@> <$1> 184106f25ae9SGregory Neil ShapiroR<?>$+ $: <@> <$1> 184206f25ae9SGregory Neil Shapirodnl workspace: <@> <address> 184306f25ae9SGregory Neil Shapirodnl prepend daemon_flags 184406f25ae9SGregory Neil ShapiroR$* $: $&{daemon_flags} $| $1 184506f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <@> <address> 184606f25ae9SGregory Neil Shapirodnl do not allow these at all or only from local systems? 184706f25ae9SGregory Neil ShapiroR$* f $* $| <@> < $* @ $- > $: < ? $&{client_name} > < $3 @ $4 > 184806f25ae9SGregory Neil Shapirodnl accept unqualified sender: change mark to avoid test 184906f25ae9SGregory Neil ShapiroR$* u $* $| <@> < $* > $: <?> < $3 > 185006f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <@> <address> 185106f25ae9SGregory Neil Shapirodnl or: <? ${client_name} > <address> 185206f25ae9SGregory Neil Shapirodnl or: <?> <address> 185306f25ae9SGregory Neil Shapirodnl remove daemon_flags 185406f25ae9SGregory Neil ShapiroR$* $| $* $: $2 185506f25ae9SGregory Neil Shapiro# handle case of @localhost on address 185606f25ae9SGregory Neil ShapiroR<@> < $* @ localhost > $: < ? $&{client_name} > < $1 @ localhost > 185706f25ae9SGregory Neil ShapiroR<@> < $* @ [127.0.0.1] > 185806f25ae9SGregory Neil Shapiro $: < ? $&{client_name} > < $1 @ [127.0.0.1] > 185906f25ae9SGregory Neil ShapiroR<@> < $* @ localhost.$m > 186006f25ae9SGregory Neil Shapiro $: < ? $&{client_name} > < $1 @ localhost.$m > 186106f25ae9SGregory Neil Shapiroifdef(`_NO_UUCP_', `dnl', 186206f25ae9SGregory Neil Shapiro`R<@> < $* @ localhost.UUCP > 186306f25ae9SGregory Neil Shapiro $: < ? $&{client_name} > < $1 @ localhost.UUCP >') 186406f25ae9SGregory Neil Shapirodnl workspace: < ? $&{client_name} > <user@localhost|host> 186506f25ae9SGregory Neil Shapirodnl or: <@> <address> 186606f25ae9SGregory Neil Shapirodnl or: <?> <address> (thanks to u in ${daemon_flags}) 186706f25ae9SGregory Neil ShapiroR<@> $* $: $1 no localhost as domain 186806f25ae9SGregory Neil Shapirodnl workspace: < ? $&{client_name} > <user@localhost|host> 186906f25ae9SGregory Neil Shapirodnl or: <address> 187006f25ae9SGregory Neil Shapirodnl or: <?> <address> (thanks to u in ${daemon_flags}) 187106f25ae9SGregory Neil ShapiroR<? $=w> $* $: $2 local client: ok 187240266059SGregory Neil ShapiroR<? $+> <$+> $#error $@ 5.5.4 $: "_CODE553 Real domain name required for sender address" 187306f25ae9SGregory Neil Shapirodnl remove <?> (happens only if ${client_name} == "" or u in ${daemon_flags}) 187406f25ae9SGregory Neil ShapiroR<?> $* $: $1') 187506f25ae9SGregory Neil Shapirodnl workspace: address (or <address>) 187606f25ae9SGregory Neil ShapiroR$* $: <?> $>CanonAddr $1 canonify sender address and mark it 187706f25ae9SGregory Neil Shapirodnl workspace: <?> CanonicalAddress (i.e. address in canonical form localpart<@host>) 187806f25ae9SGregory Neil Shapirodnl there is nothing behind the <@host> so no trailing $* needed 1879065a643dSPeter WemmR<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots 1880c2aa98e2SPeter Wemm# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) 1881959366dcSGregory Neil ShapiroR<?> $* < @ $* $=P > $: <_RES_OK_> $1 < @ $2 $3 > 188206f25ae9SGregory Neil Shapirodnl workspace <mark> CanonicalAddress where mark is ? or OK 188394c01205SGregory Neil Shapirodnl A sender address with my local host name ($j) is safe 1884959366dcSGregory Neil ShapiroR<?> $* < @ $j > $: <_RES_OK_> $1 < @ $j > 1885c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_', 188640266059SGregory Neil Shapiro`R<?> $* < @ $+ > $: <_RES_OK_> $1 < @ $2 > ... unresolvable OK', 188706f25ae9SGregory Neil Shapiro`R<?> $* < @ $+ > $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > 188806f25ae9SGregory Neil ShapiroR<? $* <$->> $* < @ $+ > 188906f25ae9SGregory Neil Shapiro $: <$2> $3 < @ $4 >') 189040266059SGregory Neil Shapirodnl workspace <mark> CanonicalAddress where mark is ?, _RES_OK_, PERM, TEMP 189106f25ae9SGregory Neil Shapirodnl mark is ? iff the address is user (wo @domain) 1892c2aa98e2SPeter Wemm 189306f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 189406f25ae9SGregory Neil Shapiro# check sender address: user@address, user@, address 189506f25ae9SGregory Neil Shapirodnl should we remove +ext from user? 189640266059SGregory Neil Shapirodnl workspace: <mark> CanonicalAddress where mark is: ?, _RES_OK_, PERM, TEMP 189740266059SGregory Neil ShapiroR<$+> $+ < @ $* > $: @<$1> <$2 < @ $3 >> $| <F:$2@$3> <U:$2@> <D:$3> 189806f25ae9SGregory Neil ShapiroR<$+> $+ $: @<$1> <$2> $| <U:$2@> 189906f25ae9SGregory Neil Shapirodnl workspace: @<mark> <CanonicalAddress> $| <@type:address> .... 190006f25ae9SGregory Neil Shapirodnl $| is used as delimiter, otherwise false matches may occur: <user<@domain>> 190106f25ae9SGregory Neil Shapirodnl will only return user<@domain when "reversing" the args 190206f25ae9SGregory Neil ShapiroR@ <$+> <$*> $| <$+> $: <@> <$1> <$2> $| $>SearchList <+ From> $| <$3> <> 190306f25ae9SGregory Neil Shapirodnl workspace: <@><mark> <CanonicalAddress> $| <result> 190406f25ae9SGregory Neil ShapiroR<@> <$+> <$*> $| <$*> $: <$3> <$1> <$2> reverse result 190506f25ae9SGregory Neil Shapirodnl workspace: <result> <mark> <CanonicalAddress> 1906c2aa98e2SPeter Wemm# retransform for further use 190706f25ae9SGregory Neil Shapirodnl required form: 190806f25ae9SGregory Neil Shapirodnl <ResultOfLookup|mark> CanonicalAddress 190906f25ae9SGregory Neil ShapiroR<?> <$+> <$*> $: <$1> $2 no match 191006f25ae9SGregory Neil ShapiroR<$+> <$+> <$*> $: <$1> $3 relevant result, keep it', `dnl') 191106f25ae9SGregory Neil Shapirodnl workspace <ResultOfLookup|mark> CanonicalAddress 191206f25ae9SGregory Neil Shapirodnl mark is ? iff the address is user (wo @domain) 1913c2aa98e2SPeter Wemm 1914c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 1915c2aa98e2SPeter Wemm# handle case of no @domain on address 191606f25ae9SGregory Neil Shapirodnl prepend daemon_flags 191706f25ae9SGregory Neil ShapiroR<?> $* $: $&{daemon_flags} $| <?> $1 191806f25ae9SGregory Neil Shapirodnl accept unqualified sender: change mark to avoid test 191940266059SGregory Neil ShapiroR$* u $* $| <?> $* $: <_RES_OK_> $3 192006f25ae9SGregory Neil Shapirodnl remove daemon_flags 192106f25ae9SGregory Neil ShapiroR$* $| $* $: $2 192213bd1963SGregory Neil ShapiroR<?> $* $: < ? $&{client_addr} > $1 1923959366dcSGregory Neil ShapiroR<?> $* $@ <_RES_OK_> ...local unqualed ok 192440266059SGregory Neil ShapiroR<? $+> $* $#error $@ 5.5.4 $: "_CODE553 Domain name required for sender address " $&f 1925c2aa98e2SPeter Wemm ...remote is not') 1926c2aa98e2SPeter Wemm# check results 192706f25ae9SGregory Neil ShapiroR<?> $* $: @ $1 mark address: nothing known about it 1928d0cef73dSGregory Neil ShapiroR<$={ResOk}> $* $: @ $2 domain ok 192906f25ae9SGregory Neil ShapiroR<TEMP> $* $#error $@ 4.1.8 $: "451 Domain of sender address " $&f " does not resolve" 193040266059SGregory Neil ShapiroR<PERM> $* $#error $@ 5.1.8 $: "_CODE553 Domain of sender address " $&f " does not exist" 193106f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 193240266059SGregory Neil ShapiroR<$={Accept}> $* $# $1 accept from access map 1933c2aa98e2SPeter WemmR<DISCARD> $* $#discard $: discard 1934e92d3f3fSGregory Neil ShapiroR<QUARANTINE:$+> $* $#error $@ quarantine $: $1 1935e92d3f3fSGregory Neil ShapiroR<REJECT> $* $#error ifdef(`confREJECT_MSG', `$: confREJECT_MSG', `$@ 5.7.1 $: "550 Access denied"') 193606f25ae9SGregory Neil Shapirodnl error tag 193706f25ae9SGregory Neil ShapiroR<ERROR:$-.$-.$-:$+> $* $#error $@ $1.$2.$3 $: $4 193806f25ae9SGregory Neil ShapiroR<ERROR:$+> $* $#error $: $1 193940266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<_ATMPF_> $* $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 194006f25ae9SGregory Neil Shapirodnl generic error from access map 194106f25ae9SGregory Neil ShapiroR<$+> $* $#error $: $1 error from access db', 1942c2aa98e2SPeter Wemm`dnl') 1943d0cef73dSGregory Neil Shapirodnl workspace: @ CanonicalAddress (i.e. address in canonical form localpart<@host>) 1944d0cef73dSGregory Neil Shapiro 1945d0cef73dSGregory Neil Shapiroifdef(`_BADMX_CHK_', `dnl 1946d0cef73dSGregory Neil ShapiroR@ $*<@$+>$* $: $1<@$2>$3 $| $>BadMX $2 1947d0cef73dSGregory Neil ShapiroR$* $| $#$* $#$2 1948d0cef73dSGregory Neil Shapiro 1949d0cef73dSGregory Neil ShapiroSBadMX 1950d0cef73dSGregory Neil Shapiro# Look up MX records and ferret away a copy of the original address. 1951d0cef73dSGregory Neil Shapiro# input: domain part of address to check 1952d0cef73dSGregory Neil ShapiroR$+ $:<MX><$1><:$(mxlist $1$):><:> 1953d0cef73dSGregory Neil Shapiro# workspace: <MX><domain><: mxlist-result $><:> 1954d0cef73dSGregory Neil ShapiroR<MX><$+><:$*<TEMP>:><$*> $#error $@ 4.1.2 $: "450 MX lookup failure for "$1 1955d0cef73dSGregory Neil Shapiro# workspace: <MX> <original destination> <unchecked mxlist> <checked mxlist> 1956d0cef73dSGregory Neil Shapiro# Recursively run badmx check on each mx. 1957d0cef73dSGregory Neil ShapiroR<MX><$*><:$+:$*><:$*> <MX><$1><:$3><: $4 $(badmx $2 $):> 1958d0cef73dSGregory Neil Shapiro# See if any of them fail. 1959e3793f76SGregory Neil ShapiroR<MX><$*><$*><$*<BADMX>:$*> $#error $@ 5.1.2 $:"550 Illegal MX record for host "$1 1960d0cef73dSGregory Neil Shapiro# Reverse the mxlists so we can use the same argument order again. 1961d0cef73dSGregory Neil ShapiroR<MX><$*><$*><$*> $:<MX><$1><$3><$2> 1962d0cef73dSGregory Neil ShapiroR<MX><$*><:$+:$*><:$*> <MX><$1><:$3><:$4 $(dnsA $2 $) :> 1963d0cef73dSGregory Neil Shapiro 1964d0cef73dSGregory Neil Shapiro# Reverse the lists so we can use the same argument order again. 1965d0cef73dSGregory Neil ShapiroR<MX><$*><$*><$*> $:<MX><$1><$3><$2> 1966d0cef73dSGregory Neil ShapiroR<MX><$*><:$+:$*><:$*> <MX><$1><:$3><:$4 $(BadMXIP $2 $) :> 1967d0cef73dSGregory Neil Shapiro 1968e3793f76SGregory Neil ShapiroR<MX><$*><$*><$*<BADMXIP>:$*> $#error $@ 5.1.2 $:"550 Invalid MX record for host "$1', 1969d0cef73dSGregory Neil Shapiro`dnl') 1970d0cef73dSGregory Neil Shapiro 1971c2aa98e2SPeter Wemm 1972c2aa98e2SPeter Wemm###################################################################### 1973c2aa98e2SPeter Wemm### check_rcpt -- check SMTP ``RCPT TO:'' command argument 1974c2aa98e2SPeter Wemm###################################################################### 1975c2aa98e2SPeter Wemm 1976c2aa98e2SPeter WemmSLocal_check_rcpt 197706f25ae9SGregory Neil ShapiroScheck`'_U_`'rcpt 1978c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_rcpt" $1 1979c2aa98e2SPeter WemmR$* $| $#$* $#$2 1980c2aa98e2SPeter WemmR$* $| $* $@ $>"Basic_check_rcpt" $1 1981c2aa98e2SPeter Wemm 1982c2aa98e2SPeter WemmSBasic_check_rcpt 198340266059SGregory Neil Shapiro# empty address? 198440266059SGregory Neil ShapiroR<> $#error $@ nouser $: "553 User address required" 198540266059SGregory Neil ShapiroR$@ $#error $@ nouser $: "553 User address required" 1986c2aa98e2SPeter Wemm# check for deferred delivery mode 198794c01205SGregory Neil ShapiroR$* $: < $&{deliveryMode} > $1 1988c2aa98e2SPeter WemmR< d > $* $@ deferred 1989c2aa98e2SPeter WemmR< $* > $* $: $2 1990c2aa98e2SPeter Wemm 199106f25ae9SGregory Neil Shapiroifdef(`_REQUIRE_QUAL_RCPT_', `dnl 199240266059SGregory Neil Shapirodnl this code checks for user@host where host is not a FQHN. 199340266059SGregory Neil Shapirodnl it is not activated. 199440266059SGregory Neil Shapirodnl notice: code to check for a recipient without a domain name is 199540266059SGregory Neil Shapirodnl available down below; look for the same macro. 199640266059SGregory Neil Shapirodnl this check is done here because the name might be qualified by the 199740266059SGregory Neil Shapirodnl canonicalization. 199840266059SGregory Neil Shapiro# require fully qualified domain part? 199940266059SGregory Neil Shapirodnl very simple canonification: make sure the address is in < > 200006f25ae9SGregory Neil ShapiroR$+ $: <?> $1 200106f25ae9SGregory Neil ShapiroR<?> <$+> $: <@> <$1> 200206f25ae9SGregory Neil ShapiroR<?> $+ $: <@> <$1> 200340266059SGregory Neil ShapiroR<@> < postmaster > $: postmaster 200413bd1963SGregory Neil ShapiroR<@> < $* @ $+ . $+ > $: < $1 @ $2 . $3 > 200506f25ae9SGregory Neil Shapirodnl prepend daemon_flags 200640266059SGregory Neil ShapiroR<@> $* $: $&{daemon_flags} $| <@> $1 200706f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <@> <address> 2008af9557fdSGregory Neil Shapirodnl _r_equire qual.rcpt: ok 2009a7ec597cSGregory Neil ShapiroR$* r $* $| <@> < $+ @ $+ > $: < $3 @ $4 > 201006f25ae9SGregory Neil Shapirodnl do not allow these at all or only from local systems? 2011a7ec597cSGregory Neil ShapiroR$* r $* $| <@> < $* > $: < ? $&{client_name} > < $3 > 201206f25ae9SGregory Neil ShapiroR<?> < $* > $: <$1> 201306f25ae9SGregory Neil ShapiroR<? $=w> < $* > $: <$1> 201440266059SGregory Neil ShapiroR<? $+> <$+> $#error $@ 5.5.4 $: "553 Fully qualified domain name required" 201506f25ae9SGregory Neil Shapirodnl remove daemon_flags for other cases 201606f25ae9SGregory Neil ShapiroR$* $| <@> $* $: $2', `dnl') 201706f25ae9SGregory Neil Shapiro 201840266059SGregory Neil Shapirodnl ################################################################## 201940266059SGregory Neil Shapirodnl call subroutines for recipient and relay 202040266059SGregory Neil Shapirodnl possible returns from subroutines: 202140266059SGregory Neil Shapirodnl $#TEMP temporary failure 202240266059SGregory Neil Shapirodnl $#error permanent failure (or temporary if from access map) 202340266059SGregory Neil Shapirodnl $#other stop processing 202440266059SGregory Neil Shapirodnl RELAY RELAYing allowed 202540266059SGregory Neil Shapirodnl other otherwise 202640266059SGregory Neil Shapiro###################################################################### 202740266059SGregory Neil ShapiroR$* $: $1 $| @ $>"Rcpt_ok" $1 202840266059SGregory Neil Shapirodnl temporary failure? remove mark @ and remember 202940266059SGregory Neil ShapiroR$* $| @ $#TEMP $+ $: $1 $| T $2 203040266059SGregory Neil Shapirodnl error or ok (stop) 203140266059SGregory Neil ShapiroR$* $| @ $#$* $#$2 203240266059SGregory Neil Shapiroifdef(`_PROMISCUOUS_RELAY_', `divert(-1)', `dnl') 203340266059SGregory Neil ShapiroR$* $| @ RELAY $@ RELAY 203440266059SGregory Neil Shapirodnl something else: call check sender (relay) 203540266059SGregory Neil ShapiroR$* $| @ $* $: O $| $>"Relay_ok" $1 203640266059SGregory Neil Shapirodnl temporary failure: call check sender (relay) 203740266059SGregory Neil ShapiroR$* $| T $+ $: T $2 $| $>"Relay_ok" $1 203840266059SGregory Neil Shapirodnl temporary failure? return that 203940266059SGregory Neil ShapiroR$* $| $#TEMP $+ $#error $2 204040266059SGregory Neil Shapirodnl error or ok (stop) 204140266059SGregory Neil ShapiroR$* $| $#$* $#$2 204240266059SGregory Neil ShapiroR$* $| RELAY $@ RELAY 204340266059SGregory Neil Shapirodnl something else: return previous temp failure 204440266059SGregory Neil ShapiroR T $+ $| $* $#error $1 204540266059SGregory Neil Shapiro# anything else is bogus 204640266059SGregory Neil ShapiroR$* $#error $@ 5.7.1 $: confRELAY_MSG 204740266059SGregory Neil Shapirodivert(0) 204840266059SGregory Neil Shapiro 204940266059SGregory Neil Shapiro###################################################################### 205040266059SGregory Neil Shapiro### Rcpt_ok: is the recipient ok? 205140266059SGregory Neil Shapirodnl input: recipient address (RCPT TO) 205240266059SGregory Neil Shapirodnl output: see explanation at call 205340266059SGregory Neil Shapiro###################################################################### 205440266059SGregory Neil ShapiroSRcpt_ok 2055c2aa98e2SPeter Wemmifdef(`_LOOSE_RELAY_CHECK_',`dnl 2056065a643dSPeter WemmR$* $: $>CanonAddr $1 2057c2aa98e2SPeter WemmR$* < @ $* . > $1 < @ $2 > strip trailing dots', 2058c2aa98e2SPeter Wemm`R$* $: $>ParseRecipient $1 strip relayable hosts') 2059c2aa98e2SPeter Wemm 2060065a643dSPeter Wemmifdef(`_BESTMX_IS_LOCAL_',`dnl 2061065a643dSPeter Wemmifelse(_BESTMX_IS_LOCAL_, `', `dnl 2062065a643dSPeter Wemm# unlimited bestmx 2063065a643dSPeter WemmR$* < @ $* > $* $: $1 < @ $2 @@ $(bestmx $2 $) > $3', 2064065a643dSPeter Wemm`dnl 2065065a643dSPeter Wemm# limit bestmx to $=B 20662e43090eSPeter WemmR$* < @ $* $=B > $* $: $1 < @ $2 $3 @@ $(bestmx $2 $3 $) > $4') 206740266059SGregory Neil ShapiroR$* $=O $* < @ $* @@ $=w . > $* $@ $>"Rcpt_ok" $1 $2 $3 2068065a643dSPeter WemmR$* < @ $* @@ $=w . > $* $: $1 < @ $3 > $4 2069065a643dSPeter WemmR$* < @ $* @@ $* > $* $: $1 < @ $2 > $4') 2070065a643dSPeter Wemm 2071c2aa98e2SPeter Wemmifdef(`_BLACKLIST_RCPT_',`dnl 207206f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 2073c2aa98e2SPeter Wemm# blacklist local users or any host from receiving mail 2074c2aa98e2SPeter WemmR$* $: <?> $1 207506f25ae9SGregory Neil Shapirodnl user is now tagged with @ to be consistent with check_mail 207606f25ae9SGregory Neil Shapirodnl and to distinguish users from hosts (com would be host, com@ would be user) 207740266059SGregory Neil ShapiroR<?> $+ < @ $=w > $: <> <$1 < @ $2 >> $| <F:$1@$2> <U:$1@> <D:$2> 207840266059SGregory Neil ShapiroR<?> $+ < @ $* > $: <> <$1 < @ $2 >> $| <F:$1@$2> <D:$2> 207906f25ae9SGregory Neil ShapiroR<?> $+ $: <> <$1> $| <U:$1@> 208006f25ae9SGregory Neil Shapirodnl $| is used as delimiter, otherwise false matches may occur: <user<@domain>> 208106f25ae9SGregory Neil Shapirodnl will only return user<@domain when "reversing" the args 208206f25ae9SGregory Neil ShapiroR<> <$*> $| <$+> $: <@> <$1> $| $>SearchList <+ To> $| <$2> <> 208306f25ae9SGregory Neil ShapiroR<@> <$*> $| <$*> $: <$2> <$1> reverse result 208406f25ae9SGregory Neil ShapiroR<?> <$*> $: @ $1 mark address as no match 208540266059SGregory Neil Shapirodnl we may have to filter here because otherwise some RHSs 208640266059SGregory Neil Shapirodnl would be interpreted as generic error messages... 208740266059SGregory Neil Shapirodnl error messages should be "tagged" by prefixing them with error: ! 208840266059SGregory Neil Shapirodnl that would make a lot of things easier. 208906f25ae9SGregory Neil ShapiroR<$={Accept}> <$*> $: @ $2 mark address as no match 209040266059SGregory Neil Shapiroifdef(`_ACCESS_SKIP_', `dnl 209140266059SGregory Neil ShapiroR<SKIP> <$*> $: @ $1 mark address as no match', `dnl') 209240266059SGregory Neil Shapiroifdef(`_DELAY_COMPAT_8_10_',`dnl 209340266059SGregory Neil Shapirodnl compatility with 8.11/8.10: 209406f25ae9SGregory Neil Shapirodnl we have to filter these because otherwise they would be interpreted 209506f25ae9SGregory Neil Shapirodnl as generic error message... 209606f25ae9SGregory Neil Shapirodnl error messages should be "tagged" by prefixing them with error: ! 209706f25ae9SGregory Neil Shapirodnl that would make a lot of things easier. 209806f25ae9SGregory Neil Shapirodnl maybe we should stop checks already here (if SPAM_xyx)? 209906f25ae9SGregory Neil ShapiroR<$={SpamTag}> <$*> $: @ $2 mark address as no match') 210040266059SGregory Neil ShapiroR<REJECT> $* $#error $@ 5.2.1 $: confRCPTREJ_MSG 210106f25ae9SGregory Neil ShapiroR<DISCARD> $* $#discard $: discard 2102e92d3f3fSGregory Neil ShapiroR<QUARANTINE:$+> $* $#error $@ quarantine $: $1 210306f25ae9SGregory Neil Shapirodnl error tag 210406f25ae9SGregory Neil ShapiroR<ERROR:$-.$-.$-:$+> $* $#error $@ $1.$2.$3 $: $4 210506f25ae9SGregory Neil ShapiroR<ERROR:$+> $* $#error $: $1 210640266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<_ATMPF_> $* $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 210706f25ae9SGregory Neil Shapirodnl generic error from access map 210806f25ae9SGregory Neil ShapiroR<$+> $* $#error $: $1 error from access db 210906f25ae9SGregory Neil ShapiroR@ $* $1 remove mark', `dnl')', `dnl') 2110c2aa98e2SPeter Wemm 211140266059SGregory Neil Shapiroifdef(`_PROMISCUOUS_RELAY_', `divert(-1)', `dnl') 211240266059SGregory Neil Shapiro# authenticated via TLS? 211340266059SGregory Neil ShapiroR$* $: $1 $| $>RelayTLS client authenticated? 211406f25ae9SGregory Neil ShapiroR$* $| $# $+ $# $2 error/ok? 211506f25ae9SGregory Neil ShapiroR$* $| $* $: $1 no 211606f25ae9SGregory Neil Shapiro 211740266059SGregory Neil ShapiroR$* $: $1 $| $>"Local_Relay_Auth" $&{auth_type} 211840266059SGregory Neil Shapirodnl workspace: localpart<@domain> $| result of Local_Relay_Auth 211940266059SGregory Neil ShapiroR$* $| $# $* $# $2 212040266059SGregory Neil Shapirodnl if Local_Relay_Auth returns NO then do not check $={TrustAuthMech} 212140266059SGregory Neil ShapiroR$* $| NO $: $1 212240266059SGregory Neil ShapiroR$* $| $* $: $1 $| $&{auth_type} 212340266059SGregory Neil Shapirodnl workspace: localpart<@domain> [ $| ${auth_type} ] 212406f25ae9SGregory Neil Shapirodnl empty ${auth_type}? 212506f25ae9SGregory Neil ShapiroR$* $| $: $1 212606f25ae9SGregory Neil Shapirodnl mechanism ${auth_type} accepted? 212706f25ae9SGregory Neil Shapirodnl use $# to override further tests (delay_checks): see check_rcpt below 212840266059SGregory Neil ShapiroR$* $| $={TrustAuthMech} $# RELAY 212940266059SGregory Neil Shapirodnl remove ${auth_type} 213006f25ae9SGregory Neil ShapiroR$* $| $* $: $1 2131193538b7SGregory Neil Shapirodnl workspace: localpart<@domain> | localpart 213206f25ae9SGregory Neil Shapiroifelse(defn(`_NO_UUCP_'), `r', 2133193538b7SGregory Neil Shapiro`R$* ! $* < @ $* > $: <REMOTE> $2 < @ BANG_PATH > 2134193538b7SGregory Neil ShapiroR$* ! $* $: <REMOTE> $2 < @ BANG_PATH >', `dnl') 2135c2aa98e2SPeter Wemm# anything terminating locally is ok 2136c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 213740266059SGregory Neil ShapiroR$+ < @ $* $=m > $@ RELAY', `dnl') 213840266059SGregory Neil ShapiroR$+ < @ $=w > $@ RELAY 2139c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 214040266059SGregory Neil Shapiro`R$+ < @ $=R > $@ RELAY 214106f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 214206f25ae9SGregory Neil ShapiroR$+ < @ $+ > $: <$(access To:$2 $: ? $)> <$1 < @ $2 >> 214306f25ae9SGregory Neil Shapirodnl workspace: <Result-of-lookup | ?> <localpart<@domain>> 214406f25ae9SGregory Neil ShapiroR<?> <$+ < @ $+ >> $: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')', 214540266059SGregory Neil Shapiro`R$+ < @ $* $=R > $@ RELAY 214606f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 2147e92d3f3fSGregory Neil Shapiroifdef(`_RELAY_FULL_ADDR_', `dnl 2148e92d3f3fSGregory Neil ShapiroR$+ < @ $+ > $: $1 < @ $2 > $| $>SearchList <+ To> $| <F:$1@$2> <D:$2> <F:$1@> <> 2149e92d3f3fSGregory Neil ShapiroR$+ < @ $+ > $| <$*> $: <$3> <$1 <@ $2>> 2150e92d3f3fSGregory Neil ShapiroR$+ < @ $+ > $| $* $: <$3> <$1 <@ $2>>', 2151e92d3f3fSGregory Neil Shapiro`R$+ < @ $+ > $: $>D <$2> <?> <+ To> <$1 < @ $2 >>')')') 215206f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 215306f25ae9SGregory Neil Shapirodnl workspace: <Result-of-lookup | ?> <localpart<@domain>> 215440266059SGregory Neil ShapiroR<RELAY> $* $@ RELAY 215540266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<$* _ATMPF_> $* $#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 2156c2aa98e2SPeter WemmR<$*> <$*> $: $2',`dnl') 2157c2aa98e2SPeter Wemm 215806f25ae9SGregory Neil Shapiro 2159c2aa98e2SPeter Wemmifdef(`_RELAY_MX_SERVED_', `dnl 2160c2aa98e2SPeter Wemm# allow relaying for hosts which we MX serve 216106f25ae9SGregory Neil ShapiroR$+ < @ $+ > $: < : $(mxserved $2 $) : > $1 < @ $2 > 216206f25ae9SGregory Neil Shapirodnl this must not necessarily happen if the client is checked first... 2163e92d3f3fSGregory Neil ShapiroR< : $* <TEMP> : > $* $#TEMP $@ 4.4.0 $: "450 Can not check MX records for recipient host " $1 216440266059SGregory Neil ShapiroR<$* : $=w . : $*> $* $@ RELAY 2165065a643dSPeter WemmR< : $* : > $* $: $2', 2166c2aa98e2SPeter Wemm`dnl') 2167c2aa98e2SPeter Wemm 2168c2aa98e2SPeter Wemm# check for local user (i.e. unqualified address) 2169c2aa98e2SPeter WemmR$* $: <?> $1 2170065a643dSPeter WemmR<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > 2171c2aa98e2SPeter Wemm# local user is ok 217206f25ae9SGregory Neil Shapirodnl is it really? the standard requires user@domain, not just user 217306f25ae9SGregory Neil Shapirodnl but we should accept it anyway (maybe making it an option: 217406f25ae9SGregory Neil Shapirodnl RequireFQDN ?) 217506f25ae9SGregory Neil Shapirodnl postmaster must be accepted without domain (DRUMS) 217606f25ae9SGregory Neil Shapiroifdef(`_REQUIRE_QUAL_RCPT_', `dnl 217740266059SGregory Neil ShapiroR<?> postmaster $@ OK 217806f25ae9SGregory Neil Shapiro# require qualified recipient? 217906f25ae9SGregory Neil Shapirodnl prepend daemon_flags 218006f25ae9SGregory Neil ShapiroR<?> $+ $: $&{daemon_flags} $| <?> $1 218106f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <?> localpart 218206f25ae9SGregory Neil Shapirodnl do not allow these at all or only from local systems? 218306f25ae9SGregory Neil Shapirodnl r flag? add client_name 218406f25ae9SGregory Neil ShapiroR$* r $* $| <?> $+ $: < ? $&{client_name} > <?> $3 218506f25ae9SGregory Neil Shapirodnl no r flag: relay to local user (only local part) 218606f25ae9SGregory Neil Shapiro# no qualified recipient required 218740266059SGregory Neil ShapiroR$* $| <?> $+ $@ RELAY 218806f25ae9SGregory Neil Shapirodnl client_name is empty 218940266059SGregory Neil ShapiroR<?> <?> $+ $@ RELAY 219006f25ae9SGregory Neil Shapirodnl client_name is local 219140266059SGregory Neil ShapiroR<? $=w> <?> $+ $@ RELAY 219206f25ae9SGregory Neil Shapirodnl client_name is not local 219306f25ae9SGregory Neil ShapiroR<? $+> $+ $#error $@ 5.5.4 $: "553 Domain name required"', `dnl 219406f25ae9SGregory Neil Shapirodnl no qualified recipient required 219540266059SGregory Neil ShapiroR<?> $+ $@ RELAY') 219606f25ae9SGregory Neil Shapirodnl it is a remote user: remove mark and then check client 2197c2aa98e2SPeter WemmR<$+> $* $: $2 219806f25ae9SGregory Neil Shapirodnl currently the recipient address is not used below 2199c2aa98e2SPeter Wemm 220040266059SGregory Neil Shapiro###################################################################### 220140266059SGregory Neil Shapiro### Relay_ok: is the relay/sender ok? 220240266059SGregory Neil Shapirodnl input: ignored 220340266059SGregory Neil Shapirodnl output: see explanation at call 220440266059SGregory Neil Shapiro###################################################################### 220540266059SGregory Neil ShapiroSRelay_ok 2206c2aa98e2SPeter Wemm# anything originating locally is ok 2207c2aa98e2SPeter Wemm# check IP address 2208c2aa98e2SPeter WemmR$* $: $&{client_addr} 220940266059SGregory Neil ShapiroR$@ $@ RELAY originated locally 221040266059SGregory Neil ShapiroR0 $@ RELAY originated locally 221113bd1963SGregory Neil ShapiroR127.0.0.1 $@ RELAY originated locally 221213bd1963SGregory Neil ShapiroRIPv6:::1 $@ RELAY originated locally 221340266059SGregory Neil ShapiroR$=R $* $@ RELAY relayable IP address 221406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 221540266059SGregory Neil ShapiroR$* $: $>A <$1> <?> <+ Connect> <$1> 221640266059SGregory Neil ShapiroR<RELAY> $* $@ RELAY relayable IP address 2217959366dcSGregory Neil Shapiroifdef(`_FFR_REJECT_IP_IN_CHECK_RCPT_',`dnl 2218959366dcSGregory Neil Shapirodnl this will cause rejections in cases like: 2219959366dcSGregory Neil Shapirodnl Connect:My.Host.Domain RELAY 2220959366dcSGregory Neil Shapirodnl Connect:My.Net REJECT 2221959366dcSGregory Neil Shapirodnl since in check_relay client_name is checked before client_addr 2222959366dcSGregory Neil ShapiroR<REJECT> $* $@ REJECT rejected IP address') 222340266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<_ATMPF_> $* $#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 2224c2aa98e2SPeter WemmR<$*> <$*> $: $2', `dnl') 2225c2aa98e2SPeter WemmR$* $: [ $1 ] put brackets around it... 222640266059SGregory Neil ShapiroR$=w $@ RELAY ... and see if it is local 2227c2aa98e2SPeter Wemm 222806f25ae9SGregory Neil Shapiroifdef(`_RELAY_DB_FROM_', `define(`_RELAY_MAIL_FROM_', `1')')dnl 222906f25ae9SGregory Neil Shapiroifdef(`_RELAY_LOCAL_FROM_', `define(`_RELAY_MAIL_FROM_', `1')')dnl 223006f25ae9SGregory Neil Shapiroifdef(`_RELAY_MAIL_FROM_', `dnl 223106f25ae9SGregory Neil Shapirodnl input: {client_addr} or something "broken" 223206f25ae9SGregory Neil Shapirodnl just throw the input away; we do not need it. 223306f25ae9SGregory Neil Shapiro# check whether FROM is allowed to use system as relay 223406f25ae9SGregory Neil ShapiroR$* $: <?> $>CanonAddr $&f 223540266059SGregory Neil ShapiroR<?> $+ < @ $+ . > <?> $1 < @ $2 > remove trailing dot 2236c2aa98e2SPeter Wemmifdef(`_RELAY_LOCAL_FROM_', `dnl 223706f25ae9SGregory Neil Shapiro# check whether local FROM is ok 223840266059SGregory Neil ShapiroR<?> $+ < @ $=w > $@ RELAY FROM local', `dnl') 223906f25ae9SGregory Neil Shapiroifdef(`_RELAY_DB_FROM_', `dnl 2240605302a5SGregory Neil ShapiroR<?> $+ < @ $+ > $: <@> $>SearchList <! From> $| <F:$1@$2> ifdef(`_RELAY_DB_FROM_DOMAIN_', ifdef(`_RELAY_HOSTS_ONLY_', `<E:$2>', `<D:$2>')) <> 224140266059SGregory Neil ShapiroR<@> <RELAY> $@ RELAY RELAY FROM sender ok 224240266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<@> <_ATMPF_> $#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 224340266059SGregory Neil Shapiro', `dnl 224440266059SGregory Neil Shapiroifdef(`_RELAY_DB_FROM_DOMAIN_', 224540266059SGregory Neil Shapiro`errprint(`*** ERROR: _RELAY_DB_FROM_DOMAIN_ requires _RELAY_DB_FROM_ 224606f25ae9SGregory Neil Shapiro')', 224706f25ae9SGregory Neil Shapiro`dnl') 224806f25ae9SGregory Neil Shapirodnl')', `dnl') 224940266059SGregory Neil Shapirodnl notice: the rulesets above do not leave a unique workspace behind. 225040266059SGregory Neil Shapirodnl it does not matter in this case because the following rule ignores 225140266059SGregory Neil Shapirodnl the input. otherwise these rules must "clean up" the workspace. 225206f25ae9SGregory Neil Shapiro 225306f25ae9SGregory Neil Shapiro# check client name: first: did it resolve? 225406f25ae9SGregory Neil Shapirodnl input: ignored 225506f25ae9SGregory Neil ShapiroR$* $: < $&{client_resolve} > 2256e92d3f3fSGregory Neil ShapiroR<TEMP> $#TEMP $@ 4.4.0 $: "450 Relaying temporarily denied. Cannot resolve PTR record for " $&{client_addr} 225706f25ae9SGregory Neil ShapiroR<FORGED> $#error $@ 5.7.1 $: "550 Relaying denied. IP name possibly forged " $&{client_name} 225806f25ae9SGregory Neil ShapiroR<FAIL> $#error $@ 5.7.1 $: "550 Relaying denied. IP name lookup failed " $&{client_name} 225906f25ae9SGregory Neil Shapirodnl ${client_resolve} should be OK, so go ahead 226040266059SGregory Neil ShapiroR$* $: <@> $&{client_name} 226106f25ae9SGregory Neil Shapirodnl should not be necessary since it has been done for client_addr already 226213bd1963SGregory Neil Shapirodnl this rule actually may cause a problem if {client_name} resolves to "" 226313bd1963SGregory Neil Shapirodnl however, this should not happen since the forward lookup should fail 226413bd1963SGregory Neil Shapirodnl and {client_resolve} should be TEMP or FAIL. 226513bd1963SGregory Neil Shapirodnl nevertheless, removing the rule doesn't hurt. 226613bd1963SGregory Neil Shapirodnl R<@> $@ RELAY 226740266059SGregory Neil Shapirodnl workspace: <@> ${client_name} (not empty) 226840266059SGregory Neil Shapiro# pass to name server to make hostname canonical 226940266059SGregory Neil ShapiroR<@> $* $=P $:<?> $1 $2 227040266059SGregory Neil ShapiroR<@> $+ $:<?> $[ $1 $] 227140266059SGregory Neil Shapirodnl workspace: <?> ${client_name} (canonified) 227240266059SGregory Neil ShapiroR$* . $1 strip trailing dots 227306f25ae9SGregory Neil Shapiroifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 227440266059SGregory Neil ShapiroR<?> $* $=m $@ RELAY', `dnl') 227540266059SGregory Neil ShapiroR<?> $=w $@ RELAY 227606f25ae9SGregory Neil Shapiroifdef(`_RELAY_HOSTS_ONLY_', 227740266059SGregory Neil Shapiro`R<?> $=R $@ RELAY 227806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 227906f25ae9SGregory Neil ShapiroR<?> $* $: <$(access Connect:$1 $: ? $)> <$1> 228006f25ae9SGregory Neil ShapiroR<?> <$*> $: <$(access $1 $: ? $)> <$1>',`dnl')', 228140266059SGregory Neil Shapiro`R<?> $* $=R $@ RELAY 228206f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 228340266059SGregory Neil ShapiroR<?> $* $: $>D <$1> <?> <+ Connect> <$1>',`dnl')') 228406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 228540266059SGregory Neil ShapiroR<RELAY> $* $@ RELAY 228640266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<$* _ATMPF_> $* $#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 228706f25ae9SGregory Neil ShapiroR<$*> <$*> $: $2',`dnl') 228840266059SGregory Neil Shapirodnl end of _PROMISCUOUS_RELAY_ 228906f25ae9SGregory Neil Shapirodivert(0) 229006f25ae9SGregory Neil Shapiroifdef(`_DELAY_CHECKS_',`dnl 229106f25ae9SGregory Neil Shapiro# turn a canonical address in the form user<@domain> 229206f25ae9SGregory Neil Shapiro# qualify unqual. addresses with $j 229306f25ae9SGregory Neil Shapirodnl it might have been only user (without <@domain>) 229406f25ae9SGregory Neil ShapiroSFullAddr 229506f25ae9SGregory Neil ShapiroR$* <@ $+ . > $1 <@ $2 > 229606f25ae9SGregory Neil ShapiroR$* <@ $* > $@ $1 <@ $2 > 229706f25ae9SGregory Neil ShapiroR$+ $@ $1 <@ $j > 2298c2aa98e2SPeter Wemm 2299a7ec597cSGregory Neil ShapiroSDelay_TLS_Clt 230013bd1963SGregory Neil Shapiro# authenticated? 230113bd1963SGregory Neil Shapirodnl code repeated here from Basic_check_mail 230213bd1963SGregory Neil Shapirodnl only called from check_rcpt in delay mode if checkrcpt returns $# 230313bd1963SGregory Neil ShapiroR$* $: $1 $| $>"tls_client" $&{verify} $| MAIL 230413bd1963SGregory Neil ShapiroR$* $| $#$+ $#$2 230513bd1963SGregory Neil Shapirodnl return result from checkrcpt 2306a7ec597cSGregory Neil ShapiroR$* $| $* $# $1 230713bd1963SGregory Neil ShapiroR$* $# $1 230813bd1963SGregory Neil Shapiro 2309a7ec597cSGregory Neil ShapiroSDelay_TLS_Clt2 231013bd1963SGregory Neil Shapiro# authenticated? 231113bd1963SGregory Neil Shapirodnl code repeated here from Basic_check_mail 231213bd1963SGregory Neil Shapirodnl only called from check_rcpt in delay mode if stopping due to Friend/Hater 231313bd1963SGregory Neil ShapiroR$* $: $1 $| $>"tls_client" $&{verify} $| MAIL 231413bd1963SGregory Neil ShapiroR$* $| $#$+ $#$2 231513bd1963SGregory Neil Shapirodnl return result from friend/hater check 2316a7ec597cSGregory Neil ShapiroR$* $| $* $@ $1 231713bd1963SGregory Neil ShapiroR$* $@ $1 231813bd1963SGregory Neil Shapiro 231906f25ae9SGregory Neil Shapiro# call all necessary rulesets 232006f25ae9SGregory Neil ShapiroScheck_rcpt 232106f25ae9SGregory Neil Shapirodnl this test should be in the Basic_check_rcpt ruleset 232206f25ae9SGregory Neil Shapirodnl which is the correct DSN code? 232306f25ae9SGregory Neil Shapiro# R$@ $#error $@ 5.1.3 $: "553 Recipient address required" 232413bd1963SGregory Neil Shapiro 232506f25ae9SGregory Neil ShapiroR$+ $: $1 $| $>checkrcpt $1 232606f25ae9SGregory Neil Shapirodnl now we can simply stop checks by returning "$# xyz" instead of just "ok" 232713bd1963SGregory Neil Shapirodnl on error (or discard) stop now 232813bd1963SGregory Neil ShapiroR$+ $| $#error $* $#error $2 232913bd1963SGregory Neil ShapiroR$+ $| $#discard $* $#discard $2 233013bd1963SGregory Neil Shapirodnl otherwise call tls_client; see above 2331a7ec597cSGregory Neil ShapiroR$+ $| $#$* $@ $>"Delay_TLS_Clt" $2 233206f25ae9SGregory Neil ShapiroR$+ $| $* $: <?> $>FullAddr $>CanonAddr $1 233306f25ae9SGregory Neil Shapiroifdef(`_SPAM_FH_', 233406f25ae9SGregory Neil Shapiro`dnl lookup user@ and user@address 233506f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `', 233606f25ae9SGregory Neil Shapiro`errprint(`*** ERROR: FEATURE(`delay_checks', `argument') requires FEATURE(`access_db') 233706f25ae9SGregory Neil Shapiro')')dnl 233806f25ae9SGregory Neil Shapirodnl one of the next two rules is supposed to match 233906f25ae9SGregory Neil Shapirodnl this code has been copied from BLACKLIST... etc 234006f25ae9SGregory Neil Shapirodnl and simplified by omitting some < >. 234140266059SGregory Neil ShapiroR<?> $+ < @ $=w > $: <> $1 < @ $2 > $| <F: $1@$2 > <D: $2 > <U: $1@> 234240266059SGregory Neil ShapiroR<?> $+ < @ $* > $: <> $1 < @ $2 > $| <F: $1@$2 > <D: $2 > 234306f25ae9SGregory Neil Shapirodnl R<?> $@ something_is_very_wrong_here 234440266059SGregory Neil Shapiro# lookup the addresses only with Spam tag 234540266059SGregory Neil ShapiroR<> $* $| <$+> $: <@> $1 $| $>SearchList <! Spam> $| <$2> <> 234606f25ae9SGregory Neil ShapiroR<@> $* $| $* $: $2 $1 reverse result 234706f25ae9SGregory Neil Shapirodnl', `dnl') 234806f25ae9SGregory Neil Shapiroifdef(`_SPAM_FRIEND_', 234906f25ae9SGregory Neil Shapiro`# is the recipient a spam friend? 235006f25ae9SGregory Neil Shapiroifdef(`_SPAM_HATER_', 235113bd1963SGregory Neil Shapiro `errprint(`*** ERROR: define either Hater or Friend -- not both. 235206f25ae9SGregory Neil Shapiro')', `dnl') 2353a7ec597cSGregory Neil ShapiroR<FRIEND> $+ $@ $>"Delay_TLS_Clt2" SPAMFRIEND 235406f25ae9SGregory Neil ShapiroR<$*> $+ $: $2', 235506f25ae9SGregory Neil Shapiro`dnl') 235606f25ae9SGregory Neil Shapiroifdef(`_SPAM_HATER_', 235706f25ae9SGregory Neil Shapiro`# is the recipient no spam hater? 235840266059SGregory Neil ShapiroR<HATER> $+ $: $1 spam hater: continue checks 2359a7ec597cSGregory Neil ShapiroR<$*> $+ $@ $>"Delay_TLS_Clt2" NOSPAMHATER everyone else: stop 236006f25ae9SGregory Neil Shapirodnl',`dnl') 2361d0cef73dSGregory Neil Shapiro 236206f25ae9SGregory Neil Shapirodnl run further checks: check_mail 236306f25ae9SGregory Neil Shapirodnl should we "clean up" $&f? 236440266059SGregory Neil Shapiroifdef(`_FFR_MAIL_MACRO', 236540266059SGregory Neil Shapiro`R$* $: $1 $| $>checkmail $&{mail_from}', 236640266059SGregory Neil Shapiro`R$* $: $1 $| $>checkmail <$&f>') 2367605302a5SGregory Neil Shapirodnl recipient (canonical format) $| result of checkmail 236806f25ae9SGregory Neil ShapiroR$* $| $#$* $#$2 236906f25ae9SGregory Neil Shapirodnl run further checks: check_relay 2370605302a5SGregory Neil ShapiroR$* $| $* $: $1 $| $>checkrelay $&{client_name} $| $&{client_addr} 237106f25ae9SGregory Neil ShapiroR$* $| $#$* $#$2 237206f25ae9SGregory Neil ShapiroR$* $| $* $: $1 237306f25ae9SGregory Neil Shapiro', `dnl') 237440266059SGregory Neil Shapiro 2375d0cef73dSGregory Neil Shapiroifdef(`_BLOCK_BAD_HELO_', `dnl 2376d0cef73dSGregory Neil ShapiroR$* $: $1 $| <$&{auth_authen}> Get auth info 2377d0cef73dSGregory Neil Shapirodnl Bypass the test for users who have authenticated. 2378d0cef73dSGregory Neil ShapiroR$* $| <$+> $: $1 skip if auth 2379d0cef73dSGregory Neil ShapiroR$* $| <$*> $: $1 $| <$&{client_addr}> [$&s] Get connection info 2380d0cef73dSGregory Neil Shapirodnl Bypass for local clients -- IP address starts with $=R 2381d0cef73dSGregory Neil ShapiroR$* $| <$=R $*> [$*] $: $1 skip if local client 2382d0cef73dSGregory Neil Shapirodnl Bypass a "sendmail -bs" session, which use 0 for client ip address 2383d0cef73dSGregory Neil ShapiroR$* $| <0> [$*] $: $1 skip if sendmail -bs 2384d0cef73dSGregory Neil Shapirodnl Reject our IP - assumes "[ip]" is in class $=w 2385d0cef73dSGregory Neil ShapiroR$* $| <$*> $=w $#error $@ 5.7.1 $:"550 bogus HELO name used: " $&s 2386d0cef73dSGregory Neil Shapirodnl Reject our hostname 2387d0cef73dSGregory Neil ShapiroR$* $| <$*> [$=w] $#error $@ 5.7.1 $:"550 bogus HELO name used: " $&s 2388d0cef73dSGregory Neil Shapirodnl Pass anything else with a "." in the domain parameter 2389d0cef73dSGregory Neil ShapiroR$* $| <$*> [$+.$+] $: $1 qualified domain ok 2390d0cef73dSGregory Neil Shapirodnl Reject if there was no "." or only an initial or final "." 2391d0cef73dSGregory Neil ShapiroR$* $| <$*> [$*] $#error $@ 5.7.1 $:"550 bogus HELO name used: " $&s 2392d0cef73dSGregory Neil Shapirodnl Clean up the workspace 2393d0cef73dSGregory Neil ShapiroR$* $| $* $: $1 2394d0cef73dSGregory Neil Shapiro', `dnl') 2395d0cef73dSGregory Neil Shapiro 239640266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl', `divert(-1)') 239740266059SGregory Neil Shapiro###################################################################### 239840266059SGregory Neil Shapiro### F: LookUpFull -- search for an entry in access database 239940266059SGregory Neil Shapiro### 240040266059SGregory Neil Shapiro### lookup of full key (which should be an address) and 240140266059SGregory Neil Shapiro### variations if +detail exists: +* and without +detail 240240266059SGregory Neil Shapiro### 240340266059SGregory Neil Shapiro### Parameters: 240440266059SGregory Neil Shapiro### <$1> -- key 240540266059SGregory Neil Shapiro### <$2> -- default (what to return if not found in db) 240640266059SGregory Neil Shapirodnl must not be empty 240740266059SGregory Neil Shapiro### <$3> -- mark (must be <(!|+) single-token>) 240840266059SGregory Neil Shapiro### ! does lookup only with tag 240940266059SGregory Neil Shapiro### + does lookup with and without tag 241040266059SGregory Neil Shapiro### <$4> -- passthru (additional data passed unchanged through) 241140266059SGregory Neil Shapirodnl returns: <default> <passthru> 241240266059SGregory Neil Shapirodnl <result> <passthru> 241340266059SGregory Neil Shapiro###################################################################### 241440266059SGregory Neil Shapiro 241540266059SGregory Neil ShapiroSF 241640266059SGregory Neil Shapirodnl workspace: <key> <def> <o tag> <thru> 241740266059SGregory Neil Shapirodnl full lookup 241840266059SGregory Neil Shapirodnl 2 3 4 5 241940266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*> $: <$(access $4`'_TAG_DELIM_`'$1 $: ? $)> <$1> <$2> <$3 $4> <$5> 242040266059SGregory Neil Shapirodnl no match, try without tag 242140266059SGregory Neil Shapirodnl 1 2 3 4 242240266059SGregory Neil ShapiroR<?> <$+> <$*> <+ $-> <$*> $: <$(access $1 $: ? $)> <$1> <$2> <+ $3> <$4> 242340266059SGregory Neil Shapirodnl no match, +detail: try +* 242440266059SGregory Neil Shapirodnl 1 2 3 4 5 6 7 242540266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <$- $-> <$*> 242640266059SGregory Neil Shapiro $: <$(access $6`'_TAG_DELIM_`'$1+*@$3 $: ? $)> <$1+$2@$3> <$4> <$5 $6> <$7> 242740266059SGregory Neil Shapirodnl no match, +detail: try +* without tag 242840266059SGregory Neil Shapirodnl 1 2 3 4 5 6 242940266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <+ $-> <$*> 243040266059SGregory Neil Shapiro $: <$(access $1+*@$3 $: ? $)> <$1+$2@$3> <$4> <+ $5> <$6> 243140266059SGregory Neil Shapirodnl no match, +detail: try without +detail 243240266059SGregory Neil Shapirodnl 1 2 3 4 5 6 7 243340266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <$- $-> <$*> 243440266059SGregory Neil Shapiro $: <$(access $6`'_TAG_DELIM_`'$1@$3 $: ? $)> <$1+$2@$3> <$4> <$5 $6> <$7> 243540266059SGregory Neil Shapirodnl no match, +detail: try without +detail and without tag 243640266059SGregory Neil Shapirodnl 1 2 3 4 5 6 243740266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <+ $-> <$*> 243840266059SGregory Neil Shapiro $: <$(access $1@$3 $: ? $)> <$1+$2@$3> <$4> <+ $5> <$6> 243940266059SGregory Neil Shapirodnl no match, return <default> <passthru> 244040266059SGregory Neil Shapirodnl 1 2 3 4 5 244140266059SGregory Neil ShapiroR<?> <$+> <$*> <$- $-> <$*> $@ <$2> <$5> 244240266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 244340266059SGregory Neil Shapirodnl 2 3 4 5 244440266059SGregory Neil ShapiroR<$+ _ATMPF_> <$*> <$- $-> <$*> $@ <_ATMPF_> <$5>', `dnl') 244540266059SGregory Neil Shapirodnl match, return <match> <passthru> 244640266059SGregory Neil Shapirodnl 2 3 4 5 244740266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*> $@ <$1> <$5> 244840266059SGregory Neil Shapiro 244940266059SGregory Neil Shapiro###################################################################### 245040266059SGregory Neil Shapiro### E: LookUpExact -- search for an entry in access database 245140266059SGregory Neil Shapiro### 245240266059SGregory Neil Shapiro### Parameters: 245340266059SGregory Neil Shapiro### <$1> -- key 245440266059SGregory Neil Shapiro### <$2> -- default (what to return if not found in db) 245540266059SGregory Neil Shapirodnl must not be empty 245640266059SGregory Neil Shapiro### <$3> -- mark (must be <(!|+) single-token>) 245740266059SGregory Neil Shapiro### ! does lookup only with tag 245840266059SGregory Neil Shapiro### + does lookup with and without tag 245940266059SGregory Neil Shapiro### <$4> -- passthru (additional data passed unchanged through) 246040266059SGregory Neil Shapirodnl returns: <default> <passthru> 246140266059SGregory Neil Shapirodnl <result> <passthru> 246240266059SGregory Neil Shapiro###################################################################### 246340266059SGregory Neil Shapiro 246440266059SGregory Neil ShapiroSE 246540266059SGregory Neil Shapirodnl 2 3 4 5 246640266059SGregory Neil ShapiroR<$*> <$*> <$- $-> <$*> $: <$(access $4`'_TAG_DELIM_`'$1 $: ? $)> <$1> <$2> <$3 $4> <$5> 246740266059SGregory Neil Shapirodnl no match, try without tag 246840266059SGregory Neil Shapirodnl 1 2 3 4 246940266059SGregory Neil ShapiroR<?> <$+> <$*> <+ $-> <$*> $: <$(access $1 $: ? $)> <$1> <$2> <+ $3> <$4> 247040266059SGregory Neil Shapirodnl no match, return default passthru 247140266059SGregory Neil Shapirodnl 1 2 3 4 5 247240266059SGregory Neil ShapiroR<?> <$+> <$*> <$- $-> <$*> $@ <$2> <$5> 247340266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 247440266059SGregory Neil Shapirodnl 2 3 4 5 247540266059SGregory Neil ShapiroR<$+ _ATMPF_> <$*> <$- $-> <$*> $@ <_ATMPF_> <$5>', `dnl') 247640266059SGregory Neil Shapirodnl match, return <match> <passthru> 247740266059SGregory Neil Shapirodnl 2 3 4 5 247840266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*> $@ <$1> <$5> 247940266059SGregory Neil Shapiro 248040266059SGregory Neil Shapiro###################################################################### 248140266059SGregory Neil Shapiro### U: LookUpUser -- search for an entry in access database 248240266059SGregory Neil Shapiro### 248340266059SGregory Neil Shapiro### lookup of key (which should be a local part) and 248440266059SGregory Neil Shapiro### variations if +detail exists: +* and without +detail 248540266059SGregory Neil Shapiro### 248640266059SGregory Neil Shapiro### Parameters: 248740266059SGregory Neil Shapiro### <$1> -- key (user@) 248840266059SGregory Neil Shapiro### <$2> -- default (what to return if not found in db) 248940266059SGregory Neil Shapirodnl must not be empty 249040266059SGregory Neil Shapiro### <$3> -- mark (must be <(!|+) single-token>) 249140266059SGregory Neil Shapiro### ! does lookup only with tag 249240266059SGregory Neil Shapiro### + does lookup with and without tag 249340266059SGregory Neil Shapiro### <$4> -- passthru (additional data passed unchanged through) 249440266059SGregory Neil Shapirodnl returns: <default> <passthru> 249540266059SGregory Neil Shapirodnl <result> <passthru> 249640266059SGregory Neil Shapiro###################################################################### 249740266059SGregory Neil Shapiro 249840266059SGregory Neil ShapiroSU 249940266059SGregory Neil Shapirodnl user lookups are always with trailing @ 250040266059SGregory Neil Shapirodnl 2 3 4 5 250140266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*> $: <$(access $4`'_TAG_DELIM_`'$1 $: ? $)> <$1> <$2> <$3 $4> <$5> 250240266059SGregory Neil Shapirodnl no match, try without tag 250340266059SGregory Neil Shapirodnl 1 2 3 4 250440266059SGregory Neil ShapiroR<?> <$+> <$*> <+ $-> <$*> $: <$(access $1 $: ? $)> <$1> <$2> <+ $3> <$4> 250540266059SGregory Neil Shapirodnl do not remove the @ from the lookup: 250640266059SGregory Neil Shapirodnl it is part of the +detail@ which is omitted for the lookup 250740266059SGregory Neil Shapirodnl no match, +detail: try +* 250840266059SGregory Neil Shapirodnl 1 2 3 4 5 6 250940266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <$- $-> <$*> 251040266059SGregory Neil Shapiro $: <$(access $5`'_TAG_DELIM_`'$1+*@ $: ? $)> <$1+$2@> <$3> <$4 $5> <$6> 251140266059SGregory Neil Shapirodnl no match, +detail: try +* without tag 251240266059SGregory Neil Shapirodnl 1 2 3 4 5 251340266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <+ $-> <$*> 251440266059SGregory Neil Shapiro $: <$(access $1+*@ $: ? $)> <$1+$2@> <$3> <+ $4> <$5> 251540266059SGregory Neil Shapirodnl no match, +detail: try without +detail 251640266059SGregory Neil Shapirodnl 1 2 3 4 5 6 251740266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <$- $-> <$*> 251840266059SGregory Neil Shapiro $: <$(access $5`'_TAG_DELIM_`'$1@ $: ? $)> <$1+$2@> <$3> <$4 $5> <$6> 251940266059SGregory Neil Shapirodnl no match, +detail: try without +detail and without tag 252040266059SGregory Neil Shapirodnl 1 2 3 4 5 252140266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <+ $-> <$*> 252240266059SGregory Neil Shapiro $: <$(access $1@ $: ? $)> <$1+$2@> <$3> <+ $4> <$5> 252340266059SGregory Neil Shapirodnl no match, return <default> <passthru> 252440266059SGregory Neil Shapirodnl 1 2 3 4 5 252540266059SGregory Neil ShapiroR<?> <$+> <$*> <$- $-> <$*> $@ <$2> <$5> 252640266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 252740266059SGregory Neil Shapirodnl 2 3 4 5 252840266059SGregory Neil ShapiroR<$+ _ATMPF_> <$*> <$- $-> <$*> $@ <_ATMPF_> <$5>', `dnl') 252940266059SGregory Neil Shapirodnl match, return <match> <passthru> 253040266059SGregory Neil Shapirodnl 2 3 4 5 253140266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*> $@ <$1> <$5> 253240266059SGregory Neil Shapiro 253306f25ae9SGregory Neil Shapiro###################################################################### 253406f25ae9SGregory Neil Shapiro### SearchList: search a list of items in the access map 253506f25ae9SGregory Neil Shapiro### Parameters: 253606f25ae9SGregory Neil Shapiro### <exact tag> $| <mark:address> <mark:address> ... <> 253706f25ae9SGregory Neil Shapirodnl maybe we should have a @ (again) in front of the mark to 253806f25ae9SGregory Neil Shapirodnl avoid errorneous matches (with error messages?) 253906f25ae9SGregory Neil Shapirodnl if we can make sure that tag is always a single token 254006f25ae9SGregory Neil Shapirodnl then we can omit the delimiter $|, otherwise we need it 254140266059SGregory Neil Shapirodnl to avoid errorneous matchs (first rule: D: if there 254206f25ae9SGregory Neil Shapirodnl is that mark somewhere in the list, it will be taken). 254306f25ae9SGregory Neil Shapirodnl moreover, we can do some tricks to enforce lookup with 254406f25ae9SGregory Neil Shapirodnl the tag only, e.g.: 254506f25ae9SGregory Neil Shapiro### where "exact" is either "+" or "!": 254606f25ae9SGregory Neil Shapiro### <+ TAG> lookup with and w/o tag 254706f25ae9SGregory Neil Shapiro### <! TAG> lookup with tag 254806f25ae9SGregory Neil Shapirodnl Warning: + and ! should be in OperatorChars (otherwise there must be 254906f25ae9SGregory Neil Shapirodnl a blank between them and the tag. 255006f25ae9SGregory Neil Shapiro### possible values for "mark" are: 255140266059SGregory Neil Shapiro### D: recursive host lookup (LookUpDomain) 255206f25ae9SGregory Neil Shapirodnl A: recursive address lookup (LookUpAddress) [not yet required] 255306f25ae9SGregory Neil Shapiro### E: exact lookup, no modifications 255406f25ae9SGregory Neil Shapiro### F: full lookup, try user+ext@domain and user@domain 255506f25ae9SGregory Neil Shapiro### U: user lookup, try user+ext and user (input must have trailing @) 255606f25ae9SGregory Neil Shapiro### return: <RHS of lookup> or <?> (not found) 255706f25ae9SGregory Neil Shapiro###################################################################### 255806f25ae9SGregory Neil Shapiro 255906f25ae9SGregory Neil Shapiro# class with valid marks for SearchList 256006f25ae9SGregory Neil Shapirodnl if A is activated: add it 2561e92d3f3fSGregory Neil ShapiroC{Src}E F D U ifdef(`_FFR_SRCHLIST_A', `A') 256206f25ae9SGregory Neil ShapiroSSearchList 256340266059SGregory Neil Shapiro# just call the ruleset with the name of the tag... nice trick... 256440266059SGregory Neil Shapirodnl 2 3 4 2565e92d3f3fSGregory Neil ShapiroR<$+> $| <$={Src}:$*> <$*> $: <$1> $| <$4> $| $>$2 <$3> <?> <$1> <> 256640266059SGregory Neil Shapirodnl workspace: <o tag> $| <rest> $| <result of lookup> <> 256740266059SGregory Neil Shapirodnl no match and nothing left: return 256840266059SGregory Neil ShapiroR<$+> $| <> $| <?> <> $@ <?> 256940266059SGregory Neil Shapirodnl no match but something left: continue 257040266059SGregory Neil ShapiroR<$+> $| <$+> $| <?> <> $@ $>SearchList <$1> $| <$2> 257140266059SGregory Neil Shapirodnl match: return 257240266059SGregory Neil ShapiroR<$+> $| <$*> $| <$+> <> $@ <$3> 257306f25ae9SGregory Neil Shapirodnl return result from recursive invocation 257440266059SGregory Neil ShapiroR<$+> $| <$+> $@ <$2> 257540266059SGregory Neil Shapirodnl endif _ACCESS_TABLE_ 257640266059SGregory Neil Shapirodivert(0) 257706f25ae9SGregory Neil Shapiro 257840266059SGregory Neil Shapiro###################################################################### 257940266059SGregory Neil Shapiro### trust_auth: is user trusted to authenticate as someone else? 258040266059SGregory Neil Shapiro### 258140266059SGregory Neil Shapiro### Parameters: 258240266059SGregory Neil Shapiro### $1: AUTH= parameter from MAIL command 258340266059SGregory Neil Shapiro###################################################################### 258440266059SGregory Neil Shapiro 258540266059SGregory Neil Shapirodnl empty ruleset definition so it can be called 258640266059SGregory Neil ShapiroSLocal_trust_auth 258706f25ae9SGregory Neil ShapiroStrust_auth 258806f25ae9SGregory Neil ShapiroR$* $: $&{auth_type} $| $1 258906f25ae9SGregory Neil Shapiro# required by RFC 2554 section 4. 259006f25ae9SGregory Neil ShapiroR$@ $| $* $#error $@ 5.7.1 $: "550 not authenticated" 259106f25ae9SGregory Neil Shapirodnl seems to be useful... 259206f25ae9SGregory Neil ShapiroR$* $| $&{auth_authen} $@ identical 259306f25ae9SGregory Neil ShapiroR$* $| <$&{auth_authen}> $@ identical 259406f25ae9SGregory Neil Shapirodnl call user supplied code 2595a7ec597cSGregory Neil ShapiroR$* $| $* $: $1 $| $>"Local_trust_auth" $2 259606f25ae9SGregory Neil ShapiroR$* $| $#$* $#$2 259706f25ae9SGregory Neil Shapirodnl default: error 259806f25ae9SGregory Neil ShapiroR$* $#error $@ 5.7.1 $: "550 " $&{auth_authen} " not allowed to act as " $&{auth_author} 259906f25ae9SGregory Neil Shapiro 260040266059SGregory Neil Shapiro###################################################################### 260140266059SGregory Neil Shapiro### Relay_Auth: allow relaying based on authentication? 260240266059SGregory Neil Shapiro### 260340266059SGregory Neil Shapiro### Parameters: 260440266059SGregory Neil Shapiro### $1: ${auth_type} 260540266059SGregory Neil Shapiro###################################################################### 260640266059SGregory Neil ShapiroSLocal_Relay_Auth 260706f25ae9SGregory Neil Shapiro 260840266059SGregory Neil Shapiro###################################################################### 260940266059SGregory Neil Shapiro### srv_features: which features to offer to a client? 261040266059SGregory Neil Shapiro### (done in server) 261140266059SGregory Neil Shapiro###################################################################### 261240266059SGregory Neil ShapiroSsrv_features 261340266059SGregory Neil Shapiroifdef(`_LOCAL_SRV_FEATURES_', `dnl 261440266059SGregory Neil ShapiroR$* $: $1 $| $>"Local_srv_features" $1 261540266059SGregory Neil ShapiroR$* $| $#$* $#$2 261640266059SGregory Neil ShapiroR$* $| $* $: $1', `dnl') 2617e92d3f3fSGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 261840266059SGregory Neil ShapiroR$* $: $>D <$&{client_name}> <?> <! SRV_FEAT_TAG> <> 261940266059SGregory Neil ShapiroR<?>$* $: $>A <$&{client_addr}> <?> <! SRV_FEAT_TAG> <> 262040266059SGregory Neil ShapiroR<?>$* $: <$(access SRV_FEAT_TAG`'_TAG_DELIM_ $: ? $)> 262106f25ae9SGregory Neil ShapiroR<?>$* $@ OK 262240266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 262340266059SGregory Neil ShapiroR<$* _ATMPF_>$* $#temp', `dnl') 2624e92d3f3fSGregory Neil ShapiroR<$+>$* $# $1') 262506f25ae9SGregory Neil Shapiro 262640266059SGregory Neil Shapiro###################################################################### 262740266059SGregory Neil Shapiro### try_tls: try to use STARTTLS? 262840266059SGregory Neil Shapiro### (done in client) 262940266059SGregory Neil Shapiro###################################################################### 263006f25ae9SGregory Neil ShapiroStry_tls 263140266059SGregory Neil Shapiroifdef(`_LOCAL_TRY_TLS_', `dnl 263240266059SGregory Neil ShapiroR$* $: $1 $| $>"Local_try_tls" $1 263340266059SGregory Neil ShapiroR$* $| $#$* $#$2 263440266059SGregory Neil ShapiroR$* $| $* $: $1', `dnl') 2635e92d3f3fSGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 263640266059SGregory Neil ShapiroR$* $: $>D <$&{server_name}> <?> <! TLS_TRY_TAG> <> 263740266059SGregory Neil ShapiroR<?>$* $: $>A <$&{server_addr}> <?> <! TLS_TRY_TAG> <> 263840266059SGregory Neil ShapiroR<?>$* $: <$(access TLS_TRY_TAG`'_TAG_DELIM_ $: ? $)> 263906f25ae9SGregory Neil ShapiroR<?>$* $@ OK 264040266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 264140266059SGregory Neil ShapiroR<$* _ATMPF_>$* $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 2642e92d3f3fSGregory Neil ShapiroR<NO>$* $#error $@ 5.7.1 $: "550 do not try TLS with " $&{server_name} " ["$&{server_addr}"]"') 264306f25ae9SGregory Neil Shapiro 264440266059SGregory Neil Shapiro###################################################################### 264540266059SGregory Neil Shapiro### tls_rcpt: is connection with server "good" enough? 264640266059SGregory Neil Shapiro### (done in client, per recipient) 264740266059SGregory Neil Shapirodnl called from deliver() before RCPT command 264840266059SGregory Neil Shapiro### 264940266059SGregory Neil Shapiro### Parameters: 265040266059SGregory Neil Shapiro### $1: recipient 265140266059SGregory Neil Shapiro###################################################################### 265240266059SGregory Neil ShapiroStls_rcpt 265340266059SGregory Neil Shapiroifdef(`_LOCAL_TLS_RCPT_', `dnl 265440266059SGregory Neil ShapiroR$* $: $1 $| $>"Local_tls_rcpt" $1 265540266059SGregory Neil ShapiroR$* $| $#$* $#$2 265640266059SGregory Neil ShapiroR$* $| $* $: $1', `dnl') 2657e92d3f3fSGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 265840266059SGregory Neil Shapirodnl store name of other side 265940266059SGregory Neil ShapiroR$* $: $(macro {TLS_Name} $@ $&{server_name} $) $1 266040266059SGregory Neil Shapirodnl canonify recipient address 266140266059SGregory Neil ShapiroR$+ $: <?> $>CanonAddr $1 266240266059SGregory Neil Shapirodnl strip trailing dots 266340266059SGregory Neil ShapiroR<?> $+ < @ $+ . > <?> $1 <@ $2 > 266440266059SGregory Neil Shapirodnl full address? 266540266059SGregory Neil ShapiroR<?> $+ < @ $+ > $: $1 <@ $2 > $| <F:$1@$2> <U:$1@> <D:$2> <E:> 266640266059SGregory Neil Shapirodnl only localpart? 266740266059SGregory Neil ShapiroR<?> $+ $: $1 $| <U:$1@> <E:> 266840266059SGregory Neil Shapirodnl look it up 266940266059SGregory Neil Shapirodnl also look up a default value via E: 267040266059SGregory Neil ShapiroR$* $| $+ $: $1 $| $>SearchList <! TLS_RCPT_TAG> $| $2 <> 267140266059SGregory Neil Shapirodnl found nothing: stop here 267240266059SGregory Neil ShapiroR$* $| <?> $@ OK 267340266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 267440266059SGregory Neil ShapiroR$* $| <$* _ATMPF_> $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 267540266059SGregory Neil Shapirodnl use the generic routine (for now) 267640266059SGregory Neil ShapiroR$* $| <$+> $@ $>"TLS_connection" $&{verify} $| <$2>') 267740266059SGregory Neil Shapiro 267840266059SGregory Neil Shapiro###################################################################### 267940266059SGregory Neil Shapiro### tls_client: is connection with client "good" enough? 268040266059SGregory Neil Shapiro### (done in server) 268140266059SGregory Neil Shapiro### 268240266059SGregory Neil Shapiro### Parameters: 268340266059SGregory Neil Shapiro### ${verify} $| (MAIL|STARTTLS) 268440266059SGregory Neil Shapiro###################################################################### 268506f25ae9SGregory Neil Shapirodnl MAIL: called from check_mail 268606f25ae9SGregory Neil Shapirodnl STARTTLS: called from smtp() after STARTTLS has been accepted 268706f25ae9SGregory Neil ShapiroStls_client 268840266059SGregory Neil Shapiroifdef(`_LOCAL_TLS_CLIENT_', `dnl 2689e3793f76SGregory Neil ShapiroR$* $: $1 <?> $>"Local_tls_client" $1 2690e3793f76SGregory Neil ShapiroR$* <?> $#$* $#$2 2691e3793f76SGregory Neil ShapiroR$* <?> $* $: $1', `dnl') 269206f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 269340266059SGregory Neil Shapirodnl store name of other side 269440266059SGregory Neil ShapiroR$* $: $(macro {TLS_Name} $@ $&{server_name} $) $1 269506f25ae9SGregory Neil Shapirodnl ignore second arg for now 269606f25ae9SGregory Neil Shapirodnl maybe use it to distinguish permanent/temporary error? 269706f25ae9SGregory Neil Shapirodnl if MAIL: permanent (STARTTLS has not been offered) 269806f25ae9SGregory Neil Shapirodnl if STARTTLS: temporary (offered but maybe failed) 269940266059SGregory Neil ShapiroR$* $| $* $: $1 $| $>D <$&{client_name}> <?> <! TLS_CLT_TAG> <> 270040266059SGregory Neil ShapiroR$* $| <?>$* $: $1 $| $>A <$&{client_addr}> <?> <! TLS_CLT_TAG> <> 270106f25ae9SGregory Neil Shapirodnl do a default lookup: just TLS_CLT_TAG 270206f25ae9SGregory Neil ShapiroR$* $| <?>$* $: $1 $| <$(access TLS_CLT_TAG`'_TAG_DELIM_ $: ? $)> 270340266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 270440266059SGregory Neil ShapiroR$* $| <$* _ATMPF_> $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 270540266059SGregory Neil ShapiroR$* $@ $>"TLS_connection" $1', `dnl 270640266059SGregory Neil ShapiroR$* $| $* $@ $>"TLS_connection" $1') 270706f25ae9SGregory Neil Shapiro 270840266059SGregory Neil Shapiro###################################################################### 270940266059SGregory Neil Shapiro### tls_server: is connection with server "good" enough? 271040266059SGregory Neil Shapiro### (done in client) 271140266059SGregory Neil Shapiro### 271240266059SGregory Neil Shapiro### Parameter: 271340266059SGregory Neil Shapiro### ${verify} 271440266059SGregory Neil Shapiro###################################################################### 271506f25ae9SGregory Neil Shapirodnl i.e. has the server been authenticated and is encryption active? 271606f25ae9SGregory Neil Shapirodnl called from deliver() after STARTTLS command 271706f25ae9SGregory Neil ShapiroStls_server 271840266059SGregory Neil Shapiroifdef(`_LOCAL_TLS_SERVER_', `dnl 271940266059SGregory Neil ShapiroR$* $: $1 $| $>"Local_tls_server" $1 272040266059SGregory Neil ShapiroR$* $| $#$* $#$2 272140266059SGregory Neil ShapiroR$* $| $* $: $1', `dnl') 272206f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 272340266059SGregory Neil Shapirodnl store name of other side 272440266059SGregory Neil ShapiroR$* $: $(macro {TLS_Name} $@ $&{server_name} $) $1 272540266059SGregory Neil ShapiroR$* $: $1 $| $>D <$&{server_name}> <?> <! TLS_SRV_TAG> <> 272640266059SGregory Neil ShapiroR$* $| <?>$* $: $1 $| $>A <$&{server_addr}> <?> <! TLS_SRV_TAG> <> 272706f25ae9SGregory Neil Shapirodnl do a default lookup: just TLS_SRV_TAG 272806f25ae9SGregory Neil ShapiroR$* $| <?>$* $: $1 $| <$(access TLS_SRV_TAG`'_TAG_DELIM_ $: ? $)> 272940266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 273040266059SGregory Neil ShapiroR$* $| <$* _ATMPF_> $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 273140266059SGregory Neil ShapiroR$* $@ $>"TLS_connection" $1', `dnl 273240266059SGregory Neil ShapiroR$* $@ $>"TLS_connection" $1') 273306f25ae9SGregory Neil Shapiro 273440266059SGregory Neil Shapiro###################################################################### 273540266059SGregory Neil Shapiro### TLS_connection: is TLS connection "good" enough? 273640266059SGregory Neil Shapiro### 273740266059SGregory Neil Shapiro### Parameters: 273806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 273940266059SGregory Neil Shapiro### ${verify} $| <Requirement> [<>]', `dnl 274040266059SGregory Neil Shapiro### ${verify}') 274140266059SGregory Neil Shapiro### Requirement: RHS from access map, may be ? for none. 274240266059SGregory Neil Shapirodnl syntax for Requirement: 274340266059SGregory Neil Shapirodnl [(PERM|TEMP)+] (VERIFY[:bits]|ENCR:bits) [+extensions] 274440266059SGregory Neil Shapirodnl extensions: could be a list of further requirements 274540266059SGregory Neil Shapirodnl for now: CN:string {cn_subject} == string 274640266059SGregory Neil Shapiro###################################################################### 274740266059SGregory Neil ShapiroSTLS_connection 274840266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl', `dnl use default error 274940266059SGregory Neil Shapirodnl deal with TLS handshake failures: abort 275040266059SGregory Neil ShapiroRSOFTWARE $#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') TLS handshake." 275140266059SGregory Neil Shapirodivert(-1)') 275206f25ae9SGregory Neil Shapirodnl common ruleset for tls_{client|server} 275340266059SGregory Neil Shapirodnl input: ${verify} $| <ResultOfLookup> [<>] 275406f25ae9SGregory Neil Shapirodnl remove optional <> 275506f25ae9SGregory Neil ShapiroR$* $| <$*>$* $: $1 $| <$2> 275640266059SGregory Neil Shapirodnl workspace: ${verify} $| <ResultOfLookup> 275740266059SGregory Neil Shapiro# create the appropriate error codes 275806f25ae9SGregory Neil Shapirodnl permanent or temporary error? 2759e92d3f3fSGregory Neil ShapiroR$* $| <PERM + $={Tls} $*> $: $1 $| <503:5.7.0> <$2 $3> 2760e92d3f3fSGregory Neil ShapiroR$* $| <TEMP + $={Tls} $*> $: $1 $| <403:4.7.0> <$2 $3> 276106f25ae9SGregory Neil Shapirodnl default case depends on TLS_PERM_ERR 2762e92d3f3fSGregory Neil ShapiroR$* $| <$={Tls} $*> $: $1 $| <ifdef(`TLS_PERM_ERR', `503:5.7.0', `403:4.7.0')> <$2 $3> 276340266059SGregory Neil Shapirodnl workspace: ${verify} $| [<SMTP:ESC>] <ResultOfLookup> 276440266059SGregory Neil Shapiro# deal with TLS handshake failures: abort 276506f25ae9SGregory Neil ShapiroRSOFTWARE $| <$-:$+> $* $#error $@ $2 $: $1 " TLS handshake failed." 276606f25ae9SGregory Neil Shapirodnl no <reply:dns> i.e. not requirements in the access map 276706f25ae9SGregory Neil Shapirodnl use default error 276806f25ae9SGregory Neil ShapiroRSOFTWARE $| $* $#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') TLS handshake failed." 27694e4196cbSGregory Neil Shapiro# deal with TLS protocol errors: abort 27704e4196cbSGregory Neil ShapiroRPROTOCOL $| <$-:$+> $* $#error $@ $2 $: $1 " STARTTLS failed." 27714e4196cbSGregory Neil Shapirodnl no <reply:dns> i.e. not requirements in the access map 27724e4196cbSGregory Neil Shapirodnl use default error 27734e4196cbSGregory Neil ShapiroRPROTOCOL $| $* $#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') STARTTLS failed." 277440266059SGregory Neil ShapiroR$* $| <$*> <VERIFY> $: <$2> <VERIFY> <> $1 277540266059SGregory Neil Shapirodnl separate optional requirements 277640266059SGregory Neil ShapiroR$* $| <$*> <VERIFY + $+> $: <$2> <VERIFY> <$3> $1 2777e92d3f3fSGregory Neil ShapiroR$* $| <$*> <$={Tls}:$->$* $: <$2> <$3:$4> <> $1 277840266059SGregory Neil Shapirodnl separate optional requirements 2779e92d3f3fSGregory Neil ShapiroR$* $| <$*> <$={Tls}:$- + $+>$* $: <$2> <$3:$4> <$5> $1 278006f25ae9SGregory Neil Shapirodnl some other value in access map: accept 278106f25ae9SGregory Neil Shapirodnl this also allows to override the default case (if used) 278206f25ae9SGregory Neil ShapiroR$* $| $* $@ OK 278306f25ae9SGregory Neil Shapiro# authentication required: give appropriate error 278406f25ae9SGregory Neil Shapiro# other side did authenticate (via STARTTLS) 278540266059SGregory Neil Shapirodnl workspace: <SMTP:ESC> <{VERIFY,ENCR}[:BITS]> <[extensions]> ${verify} 278606f25ae9SGregory Neil Shapirodnl only verification required and it succeeded 278740266059SGregory Neil ShapiroR<$*><VERIFY> <> OK $@ OK 278840266059SGregory Neil Shapirodnl verification required and it succeeded but extensions are given 278940266059SGregory Neil Shapirodnl change it to <SMTP:ESC> <REQ:0> <extensions> 279040266059SGregory Neil ShapiroR<$*><VERIFY> <$+> OK $: <$1> <REQ:0> <$2> 279106f25ae9SGregory Neil Shapirodnl verification required + some level of encryption 279240266059SGregory Neil ShapiroR<$*><VERIFY:$-> <$*> OK $: <$1> <REQ:$2> <$3> 279306f25ae9SGregory Neil Shapirodnl just some level of encryption required 279440266059SGregory Neil ShapiroR<$*><ENCR:$-> <$*> $* $: <$1> <REQ:$2> <$3> 279540266059SGregory Neil Shapirodnl workspace: 279640266059SGregory Neil Shapirodnl 1. <SMTP:ESC> <VERIFY [:bits]> <[extensions]> {verify} (!= OK) 279740266059SGregory Neil Shapirodnl 2. <SMTP:ESC> <REQ:bits> <[extensions]> 279840266059SGregory Neil Shapirodnl verification required but ${verify} is not set (case 1.) 279940266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> $#error $@ $2 $: $1 " authentication required" 280040266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> FAIL $#error $@ $2 $: $1 " authentication failed" 280140266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> NO $#error $@ $2 $: $1 " not authenticated" 280240266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> NOT $#error $@ $2 $: $1 " no authentication requested" 280340266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> NONE $#error $@ $2 $: $1 " other side does not support STARTTLS" 280406f25ae9SGregory Neil Shapirodnl some other value for ${verify} 280540266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> $+ $#error $@ $2 $: $1 " authentication failure " $4 280640266059SGregory Neil Shapirodnl some level of encryption required: get the maximum level (case 2.) 280740266059SGregory Neil ShapiroR<$*><REQ:$-> <$*> $: <$1> <REQ:$2> <$3> $>max $&{cipher_bits} : $&{auth_ssf} 280806f25ae9SGregory Neil Shapirodnl compare required bits with actual bits 280940266059SGregory Neil ShapiroR<$*><REQ:$-> <$*> $- $: <$1> <$2:$4> <$3> $(arith l $@ $4 $@ $2 $) 281040266059SGregory Neil ShapiroR<$-:$+><$-:$-> <$*> TRUE $#error $@ $2 $: $1 " encryption too weak " $4 " less than " $3 281140266059SGregory Neil Shapirodnl strength requirements fulfilled 281240266059SGregory Neil Shapirodnl TLS Additional Requirements Separator 281340266059SGregory Neil Shapirodnl this should be something which does not appear in the extensions itself 281440266059SGregory Neil Shapirodnl @ could be part of a CN, DN, etc... 281540266059SGregory Neil Shapirodnl use < > ? those are encoded in CN, DN, ... 281640266059SGregory Neil Shapirodefine(`_TLS_ARS_', `++')dnl 281740266059SGregory Neil Shapirodnl workspace: 281840266059SGregory Neil Shapirodnl <SMTP:ESC> <REQ:bits> <extensions> result-of-compare 281940266059SGregory Neil ShapiroR<$-:$+><$-:$-> <$*> $* $: <$1:$2 _TLS_ARS_ $5> 282040266059SGregory Neil Shapirodnl workspace: <SMTP:ESC _TLS_ARS_ extensions> 282140266059SGregory Neil Shapirodnl continue: check extensions 282240266059SGregory Neil ShapiroR<$-:$+ _TLS_ARS_ > $@ OK 282340266059SGregory Neil Shapirodnl split extensions into own list 282440266059SGregory Neil ShapiroR<$-:$+ _TLS_ARS_ $+ > $: <$1:$2> <$3> 282540266059SGregory Neil ShapiroR<$-:$+> < $+ _TLS_ARS_ $+ > <$1:$2> <$3> <$4> 282640266059SGregory Neil ShapiroR<$-:$+> $+ $@ $>"TLS_req" $3 $| <$1:$2> 282706f25ae9SGregory Neil Shapiro 282840266059SGregory Neil Shapiro###################################################################### 282940266059SGregory Neil Shapiro### TLS_req: check additional TLS requirements 283040266059SGregory Neil Shapiro### 283140266059SGregory Neil Shapiro### Parameters: [<list> <of> <req>] $| <$-:$+> 283240266059SGregory Neil Shapiro### $-: SMTP reply code 283340266059SGregory Neil Shapiro### $+: Enhanced Status Code 283440266059SGregory Neil Shapirodnl further requirements for this ruleset: 283540266059SGregory Neil Shapirodnl name of "other side" is stored is {TLS_name} (client/server_name) 283640266059SGregory Neil Shapirodnl 283740266059SGregory Neil Shapirodnl currently only CN[:common_name] is implemented 283840266059SGregory Neil Shapirodnl right now this is only a logical AND 283940266059SGregory Neil Shapirodnl i.e. all requirements must be true 284040266059SGregory Neil Shapirodnl how about an OR? CN must be X or CN must be Y or .. 284140266059SGregory Neil Shapirodnl use a macro to compute this as a trivial sequential 284240266059SGregory Neil Shapirodnl operations (no precedences etc)? 284340266059SGregory Neil Shapiro###################################################################### 284440266059SGregory Neil ShapiroSTLS_req 284540266059SGregory Neil Shapirodnl no additional requirements: ok 284640266059SGregory Neil ShapiroR $| $+ $@ OK 284740266059SGregory Neil Shapirodnl require CN: but no CN specified: use name of other side 284840266059SGregory Neil ShapiroR<CN> $* $| <$+> $: <CN:$&{TLS_Name}> $1 $| <$2> 284940266059SGregory Neil Shapirodnl match, check rest 285040266059SGregory Neil ShapiroR<CN:$&{cn_subject}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2> 285140266059SGregory Neil Shapirodnl CN does not match 285240266059SGregory Neil Shapirodnl 1 2 3 4 285340266059SGregory Neil ShapiroR<CN:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " CN " $&{cn_subject} " does not match " $1 285440266059SGregory Neil Shapirodnl cert subject 285540266059SGregory Neil ShapiroR<CS:$&{cert_subject}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2> 285640266059SGregory Neil Shapirodnl CS does not match 285740266059SGregory Neil Shapirodnl 1 2 3 4 285813bd1963SGregory Neil ShapiroR<CS:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " Cert Subject " $&{cert_subject} " does not match " $1 285940266059SGregory Neil Shapirodnl match, check rest 286040266059SGregory Neil ShapiroR<CI:$&{cert_issuer}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2> 286140266059SGregory Neil Shapirodnl CI does not match 286240266059SGregory Neil Shapirodnl 1 2 3 4 286313bd1963SGregory Neil ShapiroR<CI:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " Cert Issuer " $&{cert_issuer} " does not match " $1 286440266059SGregory Neil Shapirodnl return from recursive call 286540266059SGregory Neil ShapiroROK $@ OK 286640266059SGregory Neil Shapiro 286740266059SGregory Neil Shapiro###################################################################### 286840266059SGregory Neil Shapiro### max: return the maximum of two values separated by : 286940266059SGregory Neil Shapiro### 287040266059SGregory Neil Shapiro### Parameters: [$-]:[$-] 287140266059SGregory Neil Shapiro###################################################################### 287206f25ae9SGregory Neil ShapiroSmax 287306f25ae9SGregory Neil ShapiroR: $: 0 287406f25ae9SGregory Neil ShapiroR:$- $: $1 287506f25ae9SGregory Neil ShapiroR$-: $: $1 287606f25ae9SGregory Neil ShapiroR$-:$- $: $(arith l $@ $1 $@ $2 $) : $1 : $2 287706f25ae9SGregory Neil ShapiroRTRUE:$-:$- $: $2 287840266059SGregory Neil ShapiroR$-:$-:$- $: $2 287940266059SGregory Neil Shapirodnl endif _ACCESS_TABLE_ 288040266059SGregory Neil Shapirodivert(0) 288106f25ae9SGregory Neil Shapiro 288240266059SGregory Neil Shapiro###################################################################### 288340266059SGregory Neil Shapiro### RelayTLS: allow relaying based on TLS authentication 288440266059SGregory Neil Shapiro### 288540266059SGregory Neil Shapiro### Parameters: 288640266059SGregory Neil Shapiro### none 288740266059SGregory Neil Shapiro###################################################################### 288840266059SGregory Neil ShapiroSRelayTLS 288906f25ae9SGregory Neil Shapiro# authenticated? 289006f25ae9SGregory Neil Shapirodnl we do not allow relaying for anyone who can present a cert 289106f25ae9SGregory Neil Shapirodnl signed by a "trusted" CA. For example, even if we put verisigns 289213bd1963SGregory Neil Shapirodnl CA in CertPath so we can authenticate users, we do not allow 289306f25ae9SGregory Neil Shapirodnl them to abuse our server (they might be easier to get hold of, 289406f25ae9SGregory Neil Shapirodnl but anyway). 289506f25ae9SGregory Neil Shapirodnl so here is the trick: if the verification succeeded 289606f25ae9SGregory Neil Shapirodnl we look up the cert issuer in the access map 289706f25ae9SGregory Neil Shapirodnl (maybe after extracting a part with a regular expression) 289806f25ae9SGregory Neil Shapirodnl if this returns RELAY we relay without further questions 289906f25ae9SGregory Neil Shapirodnl if it returns SUBJECT we perform a similar check on the 290006f25ae9SGregory Neil Shapirodnl cert subject. 290106f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 290240266059SGregory Neil ShapiroR$* $: <?> $&{verify} 290340266059SGregory Neil ShapiroR<?> OK $: OK authenticated: continue 290440266059SGregory Neil ShapiroR<?> $* $@ NO not authenticated 290506f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_ISSUER_', `dnl 290640266059SGregory Neil ShapiroR$* $: $(CERTIssuer $&{cert_issuer} $)', 290740266059SGregory Neil Shapiro`R$* $: $&{cert_issuer}') 290840266059SGregory Neil ShapiroR$+ $: $(access CERTISSUER`'_TAG_DELIM_`'$1 $) 290906f25ae9SGregory Neil Shapirodnl use $# to stop further checks (delay_check) 291040266059SGregory Neil ShapiroRRELAY $# RELAY 291106f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_SUBJECT_', `dnl 291240266059SGregory Neil ShapiroRSUBJECT $: <@> $(CERTSubject $&{cert_subject} $)', 291340266059SGregory Neil Shapiro`RSUBJECT $: <@> $&{cert_subject}') 291440266059SGregory Neil ShapiroR<@> $+ $: <@> $(access CERTSUBJECT`'_TAG_DELIM_`'$1 $) 291540266059SGregory Neil ShapiroR<@> RELAY $# RELAY 291640266059SGregory Neil ShapiroR$* $: NO', `dnl') 291740266059SGregory Neil Shapiro 291840266059SGregory Neil Shapiro###################################################################### 291940266059SGregory Neil Shapiro### authinfo: lookup authinfo in the access map 292040266059SGregory Neil Shapiro### 292140266059SGregory Neil Shapiro### Parameters: 292240266059SGregory Neil Shapiro### $1: {server_name} 292340266059SGregory Neil Shapiro### $2: {server_addr} 292440266059SGregory Neil Shapirodnl both are currently ignored 292540266059SGregory Neil Shapirodnl if it should be done via another map, we either need to restrict 292640266059SGregory Neil Shapirodnl functionality (it calls D and A) or copy those rulesets (or add another 292740266059SGregory Neil Shapirodnl parameter which I want to avoid, it's quite complex already) 292840266059SGregory Neil Shapiro###################################################################### 292940266059SGregory Neil Shapirodnl omit this ruleset if neither is defined? 293040266059SGregory Neil Shapirodnl it causes DefaultAuthInfo to be ignored 293140266059SGregory Neil Shapirodnl (which may be considered a good thing). 293240266059SGregory Neil ShapiroSauthinfo 293340266059SGregory Neil Shapiroifdef(`_AUTHINFO_TABLE_', `dnl 293440266059SGregory Neil ShapiroR$* $: <$(authinfo AuthInfo:$&{server_name} $: ? $)> 293540266059SGregory Neil ShapiroR<?> $: <$(authinfo AuthInfo:$&{server_addr} $: ? $)> 293640266059SGregory Neil ShapiroR<?> $: <$(authinfo AuthInfo: $: ? $)> 293740266059SGregory Neil ShapiroR<?> $@ no no authinfo available 293840266059SGregory Neil ShapiroR<$*> $# $1 293940266059SGregory Neil Shapirodnl', `dnl 294040266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 294140266059SGregory Neil ShapiroR$* $: $1 $| $>D <$&{server_name}> <?> <! AuthInfo> <> 294240266059SGregory Neil ShapiroR$* $| <?>$* $: $1 $| $>A <$&{server_addr}> <?> <! AuthInfo> <> 294340266059SGregory Neil ShapiroR$* $| <?>$* $: $1 $| <$(access AuthInfo`'_TAG_DELIM_ $: ? $)> <> 294440266059SGregory Neil ShapiroR$* $| <?>$* $@ no no authinfo available 294540266059SGregory Neil ShapiroR$* $| <$*> <> $# $2 294640266059SGregory Neil Shapirodnl', `dnl')') 294706f25ae9SGregory Neil Shapiro 2948e92d3f3fSGregory Neil Shapiroifdef(`_RATE_CONTROL_',`dnl 2949e92d3f3fSGregory Neil Shapiro###################################################################### 2950e92d3f3fSGregory Neil Shapiro### RateControl: 2951e92d3f3fSGregory Neil Shapiro### Parameters: ignored 2952e92d3f3fSGregory Neil Shapiro### return: $#error or OK 2953e92d3f3fSGregory Neil Shapiro###################################################################### 2954e92d3f3fSGregory Neil ShapiroSRateControl 2955e92d3f3fSGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 2956e92d3f3fSGregory Neil ShapiroR$* $: <A:$&{client_addr}> <E:> 2957e92d3f3fSGregory Neil Shapirodnl also look up a default value via E: 2958e92d3f3fSGregory Neil ShapiroR$+ $: $>SearchList <! ClientRate> $| $1 <> 2959e92d3f3fSGregory Neil Shapirodnl found nothing: stop here 2960e92d3f3fSGregory Neil ShapiroR<?> $@ OK 2961e92d3f3fSGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 2962e92d3f3fSGregory Neil ShapiroR<$* _ATMPF_> $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 2963e92d3f3fSGregory Neil Shapirodnl use the generic routine (for now) 2964e92d3f3fSGregory Neil ShapiroR<0> $@ OK no limit 2965ffb83623SGregory Neil ShapiroR<$+> $: <$1> $| $(arith l $@ $1 $@ $&{client_rate} $) 2966e92d3f3fSGregory Neil Shapirodnl log this? Connection rate $&{client_rate} exceeds limit $1. 2967ffb83623SGregory Neil ShapiroR<$+> $| TRUE $#error $@ 4.3.2 $: _RATE_CONTROL_REPLY Connection rate limit exceeded. 2968e92d3f3fSGregory Neil Shapiro')') 2969e92d3f3fSGregory Neil Shapiro 2970e92d3f3fSGregory Neil Shapiroifdef(`_CONN_CONTROL_',`dnl 2971e92d3f3fSGregory Neil Shapiro###################################################################### 2972e92d3f3fSGregory Neil Shapiro### ConnControl: 2973e92d3f3fSGregory Neil Shapiro### Parameters: ignored 2974e92d3f3fSGregory Neil Shapiro### return: $#error or OK 2975e92d3f3fSGregory Neil Shapiro###################################################################### 2976e92d3f3fSGregory Neil ShapiroSConnControl 2977e92d3f3fSGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl 2978e92d3f3fSGregory Neil ShapiroR$* $: <A:$&{client_addr}> <E:> 2979e92d3f3fSGregory Neil Shapirodnl also look up a default value via E: 2980e92d3f3fSGregory Neil ShapiroR$+ $: $>SearchList <! ClientConn> $| $1 <> 2981e92d3f3fSGregory Neil Shapirodnl found nothing: stop here 2982e92d3f3fSGregory Neil ShapiroR<?> $@ OK 2983e92d3f3fSGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail? 2984e92d3f3fSGregory Neil ShapiroR<$* _ATMPF_> $#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl') 2985e92d3f3fSGregory Neil Shapirodnl use the generic routine (for now) 2986e92d3f3fSGregory Neil ShapiroR<0> $@ OK no limit 2987ffb83623SGregory Neil ShapiroR<$+> $: <$1> $| $(arith l $@ $1 $@ $&{client_connections} $) 2988e92d3f3fSGregory Neil Shapirodnl log this: Open connections $&{client_connections} exceeds limit $1. 2989ffb83623SGregory Neil ShapiroR<$+> $| TRUE $#error $@ 4.3.2 $: _CONN_CONTROL_REPLY Too many open connections. 2990e92d3f3fSGregory Neil Shapiro')') 2991e92d3f3fSGregory Neil Shapiro 299206f25ae9SGregory Neil Shapiroundivert(9)dnl LOCAL_RULESETS 299306f25ae9SGregory Neil Shapiro# 299406f25ae9SGregory Neil Shapiro###################################################################### 299506f25ae9SGregory Neil Shapiro###################################################################### 299606f25ae9SGregory Neil Shapiro##### 299706f25ae9SGregory Neil Shapiro`##### MAIL FILTER DEFINITIONS' 299806f25ae9SGregory Neil Shapiro##### 299906f25ae9SGregory Neil Shapiro###################################################################### 300006f25ae9SGregory Neil Shapiro###################################################################### 300140266059SGregory Neil Shapiro_MAIL_FILTERS_ 3002c2aa98e2SPeter Wemm# 3003c2aa98e2SPeter Wemm###################################################################### 3004c2aa98e2SPeter Wemm###################################################################### 3005c2aa98e2SPeter Wemm##### 3006c2aa98e2SPeter Wemm`##### MAILER DEFINITIONS' 3007c2aa98e2SPeter Wemm##### 3008c2aa98e2SPeter Wemm###################################################################### 3009c2aa98e2SPeter Wemm###################################################################### 301006f25ae9SGregory Neil Shapiroundivert(7)dnl MAILER_DEFINITIONS 301142e5d165SGregory Neil Shapiro 3012