xref: /freebsd/contrib/sendmail/cf/m4/proto.m4 (revision a7ec597c)
1c2aa98e2SPeter Wemmdivert(-1)
2c2aa98e2SPeter Wemm#
3a7ec597cSGregory Neil Shapiro# Copyright (c) 1998-2003 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
16a7ec597cSGregory Neil ShapiroVERSIONID(`$Id: proto.m4,v 8.649.2.24 2003/08/04 21:14:26 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
114c2aa98e2SPeter WemmCP.
115c2aa98e2SPeter Wemm
116c2aa98e2SPeter Wemmifdef(`UUCP_RELAY',
117c2aa98e2SPeter Wemm`# UUCP relay host
118c2aa98e2SPeter WemmDY`'UUCP_RELAY
119c2aa98e2SPeter WemmCPUUCP
120c2aa98e2SPeter Wemm
121c2aa98e2SPeter Wemm')dnl
122c2aa98e2SPeter Wemmifdef(`BITNET_RELAY',
123c2aa98e2SPeter Wemm`#  BITNET relay host
124c2aa98e2SPeter WemmDB`'BITNET_RELAY
125c2aa98e2SPeter WemmCPBITNET
126c2aa98e2SPeter Wemm
127c2aa98e2SPeter Wemm')dnl
128c2aa98e2SPeter Wemmifdef(`DECNET_RELAY',
129c2aa98e2SPeter Wemm`define(`_USE_DECNET_SYNTAX_', 1)dnl
130c2aa98e2SPeter Wemm# DECnet relay host
131c2aa98e2SPeter WemmDC`'DECNET_RELAY
132c2aa98e2SPeter WemmCPDECNET
133c2aa98e2SPeter Wemm
134c2aa98e2SPeter Wemm')dnl
135c2aa98e2SPeter Wemmifdef(`FAX_RELAY',
136c2aa98e2SPeter Wemm`# FAX relay host
137c2aa98e2SPeter WemmDF`'FAX_RELAY
138c2aa98e2SPeter WemmCPFAX
139c2aa98e2SPeter Wemm
140c2aa98e2SPeter Wemm')dnl
141c2aa98e2SPeter Wemm# "Smart" relay host (may be null)
14240266059SGregory Neil ShapiroDS`'ifdef(`SMART_HOST', `SMART_HOST')
143c2aa98e2SPeter Wemm
144c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl
145c2aa98e2SPeter Wemm# place to which unknown users should be forwarded
146c2aa98e2SPeter WemmKuser user -m -a<>
147c2aa98e2SPeter WemmDL`'LUSER_RELAY',
148c2aa98e2SPeter Wemm`dnl')
149c2aa98e2SPeter Wemm
150c2aa98e2SPeter Wemm# operators that cannot be in local usernames (i.e., network indicators)
151c2aa98e2SPeter WemmCO @ % ifdef(`_NO_UUCP_', `', `!')
152c2aa98e2SPeter Wemm
153c2aa98e2SPeter Wemm# a class with just dot (for identifying canonical names)
154c2aa98e2SPeter WemmC..
155c2aa98e2SPeter Wemm
156c2aa98e2SPeter Wemm# a class with just a left bracket (for identifying domain literals)
157c2aa98e2SPeter WemmC[[
158c2aa98e2SPeter Wemm
15906f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
16006f25ae9SGregory Neil Shapiro# access_db acceptance class
16106f25ae9SGregory Neil ShapiroC{Accept}OK RELAY
16240266059SGregory Neil Shapiroifdef(`_DELAY_COMPAT_8_10_',`dnl
16306f25ae9SGregory Neil Shapiroifdef(`_BLACKLIST_RCPT_',`dnl
16406f25ae9SGregory Neil Shapiro# possible access_db RHS for spam friends/haters
16506f25ae9SGregory Neil ShapiroC{SpamTag}SPAMFRIEND SPAMHATER')')',
166c2aa98e2SPeter Wemm`dnl')
167c2aa98e2SPeter Wemm
16840266059SGregory Neil Shapirodnl mark for "domain is ok" (resolved or accepted anyway)
16940266059SGregory Neil Shapirodefine(`_RES_OK_', `OKR')dnl
170c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_',`dnl',`dnl
171c2aa98e2SPeter Wemm# Resolve map (to check if a host exists in check_mail)
17240266059SGregory Neil ShapiroKresolve host -a<_RES_OK_> -T<TEMP>')
17340266059SGregory Neil ShapiroC{ResOk}_RES_OK_
174c2aa98e2SPeter Wemm
17513058a91SGregory Neil Shapiroifdef(`_NEED_MACRO_MAP_', `dnl
17613058a91SGregory Neil Shapiroifdef(`_MACRO_MAP_', `', `# macro storage map
17713058a91SGregory Neil Shapirodefine(`_MACRO_MAP_', `1')dnl
17813058a91SGregory Neil ShapiroKmacro macro')', `dnl')
17942e5d165SGregory Neil Shapiro
180c2aa98e2SPeter Wemmifdef(`confCR_FILE', `dnl
18142e5d165SGregory Neil Shapiro# Hosts for which relaying is permitted ($=R)
182c2aa98e2SPeter WemmFR`'confCR_FILE',
183c2aa98e2SPeter Wemm`dnl')
184c2aa98e2SPeter Wemm
18540266059SGregory Neil Shapirodefine(`TLS_SRV_TAG', `"TLS_Srv"')dnl
18640266059SGregory Neil Shapirodefine(`TLS_CLT_TAG', `"TLS_Clt"')dnl
18740266059SGregory Neil Shapirodefine(`TLS_RCPT_TAG', `"TLS_Rcpt"')dnl
18840266059SGregory Neil Shapirodefine(`TLS_TRY_TAG', `"Try_TLS"')dnl
18940266059SGregory Neil Shapirodefine(`SRV_FEAT_TAG', `"Srv_Features"')dnl
19006f25ae9SGregory Neil Shapirodnl this may be useful in other contexts too
19106f25ae9SGregory Neil Shapiroifdef(`_ARITH_MAP_', `', `# arithmetic map
19206f25ae9SGregory Neil Shapirodefine(`_ARITH_MAP_', `1')dnl
19306f25ae9SGregory Neil ShapiroKarith arith')
19406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
19540266059SGregory Neil Shapiroifdef(`_MACRO_MAP_', `', `# macro storage map
19640266059SGregory Neil Shapirodefine(`_MACRO_MAP_', `1')dnl
19740266059SGregory Neil ShapiroKmacro macro')
19840266059SGregory Neil Shapiro# possible values for TLS_connection in access map
19906f25ae9SGregory Neil ShapiroC{tls}VERIFY ENCR', `dnl')
20006f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_ISSUER_', `dnl
20106f25ae9SGregory Neil Shapiro# extract relevant part from cert issuer
20206f25ae9SGregory Neil ShapiroKCERTIssuer regex _CERT_REGEX_ISSUER_', `dnl')
20306f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_SUBJECT_', `dnl
20406f25ae9SGregory Neil Shapiro# extract relevant part from cert subject
20506f25ae9SGregory Neil ShapiroKCERTSubject regex _CERT_REGEX_SUBJECT_', `dnl')
20606f25ae9SGregory Neil Shapiro
20740266059SGregory Neil Shapiroifdef(`LOCAL_RELAY', `dnl
208fabecb74SGregory Neil Shapiro# who I send unqualified names to if `FEATURE(stickyhost)' is used
20913bd1963SGregory Neil Shapiro# (null means deliver locally)
21040266059SGregory Neil ShapiroDR`'LOCAL_RELAY')
211c2aa98e2SPeter Wemm
21240266059SGregory Neil Shapiroifdef(`MAIL_HUB', `dnl
21313bd1963SGregory Neil Shapiro# who gets all local email traffic
214fabecb74SGregory Neil Shapiro# ($R has precedence for unqualified names if `FEATURE(stickyhost)' is used)
21540266059SGregory Neil ShapiroDH`'MAIL_HUB')
216c2aa98e2SPeter Wemm
217c2aa98e2SPeter Wemm# dequoting map
21840266059SGregory Neil ShapiroKdequote dequote`'ifdef(`confDEQUOTE_OPTS', ` confDEQUOTE_OPTS', `')
219c2aa98e2SPeter Wemm
220c2aa98e2SPeter Wemmdivert(0)dnl	# end of nullclient diversion
221c2aa98e2SPeter Wemm# class E: names that should be exposed as from this host, even if we masquerade
22206f25ae9SGregory Neil Shapiro# class L: names that should be delivered locally, even if we have a relay
223c2aa98e2SPeter Wemm# class M: domains that should be converted to $M
22406f25ae9SGregory Neil Shapiro# class N: domains that should not be converted to $M
225c2aa98e2SPeter Wemm#CL root
226c2aa98e2SPeter Wemmundivert(5)dnl
22706f25ae9SGregory Neil Shapiroifdef(`_VIRTHOSTS_', `CR$={VirtHost}', `dnl')
228c2aa98e2SPeter Wemm
22940266059SGregory Neil Shapiroifdef(`MASQUERADE_NAME', `dnl
230c2aa98e2SPeter Wemm# who I masquerade as (null for no masquerading) (see also $=M)
23140266059SGregory Neil ShapiroDM`'MASQUERADE_NAME')
232c2aa98e2SPeter Wemm
233c2aa98e2SPeter Wemm# my name for error messages
234c2aa98e2SPeter Wemmifdef(`confMAILER_NAME', `Dn`'confMAILER_NAME', `#DnMAILER-DAEMON')
235c2aa98e2SPeter Wemm
23606f25ae9SGregory Neil Shapiroundivert(6)dnl LOCAL_CONFIG
237c2aa98e2SPeter Wemminclude(_CF_DIR_`m4/version.m4')
238c2aa98e2SPeter Wemm
239c2aa98e2SPeter Wemm###############
240c2aa98e2SPeter Wemm#   Options   #
241c2aa98e2SPeter Wemm###############
24240266059SGregory Neil Shapiroifdef(`confAUTO_REBUILD',
24340266059SGregory Neil Shapiro`errprint(WARNING: `confAUTO_REBUILD' is no longer valid.
24440266059SGregory Neil Shapiro	There was a potential for a denial of service attack if this is set.
24540266059SGregory Neil Shapiro)')dnl
246c2aa98e2SPeter Wemm
247c2aa98e2SPeter Wemm# strip message body to 7 bits on input?
24806f25ae9SGregory Neil Shapiro_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT', `False')
249c2aa98e2SPeter Wemm
250c2aa98e2SPeter Wemm# 8-bit data handling
2518774250cSGregory Neil Shapiro_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', `pass8')
252c2aa98e2SPeter Wemm
253c2aa98e2SPeter Wemm# wait for alias file rebuild (default units: minutes)
25406f25ae9SGregory Neil Shapiro_OPTION(AliasWait, `confALIAS_WAIT', `5m')
255c2aa98e2SPeter Wemm
256c2aa98e2SPeter Wemm# location of alias file
25706f25ae9SGregory Neil Shapiro_OPTION(AliasFile, `ALIAS_FILE', `MAIL_SETTINGS_DIR`'aliases')
25806f25ae9SGregory Neil Shapiro
259c2aa98e2SPeter Wemm# minimum number of free blocks on filesystem
26006f25ae9SGregory Neil Shapiro_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', `100')
261c2aa98e2SPeter Wemm
262c2aa98e2SPeter Wemm# maximum message size
26306f25ae9SGregory Neil Shapiro_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', `1000000')
264c2aa98e2SPeter Wemm
265c2aa98e2SPeter Wemm# substitution for space (blank) characters
26606f25ae9SGregory Neil Shapiro_OPTION(BlankSub, `confBLANK_SUB', `_')
267c2aa98e2SPeter Wemm
268c2aa98e2SPeter Wemm# avoid connecting to "expensive" mailers on initial submission?
26906f25ae9SGregory Neil Shapiro_OPTION(HoldExpensive, `confCON_EXPENSIVE', `False')
270c2aa98e2SPeter Wemm
271c2aa98e2SPeter Wemm# checkpoint queue runs after every N successful deliveries
27206f25ae9SGregory Neil Shapiro_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', `10')
273c2aa98e2SPeter Wemm
274c2aa98e2SPeter Wemm# default delivery mode
27506f25ae9SGregory Neil Shapiro_OPTION(DeliveryMode, `confDELIVERY_MODE', `background')
276c2aa98e2SPeter Wemm
277c2aa98e2SPeter Wemm# error message header/file
27806f25ae9SGregory Neil Shapiro_OPTION(ErrorHeader, `confERROR_MESSAGE', `MAIL_SETTINGS_DIR`'error-header')
279c2aa98e2SPeter Wemm
280c2aa98e2SPeter Wemm# error mode
28106f25ae9SGregory Neil Shapiro_OPTION(ErrorMode, `confERROR_MODE', `print')
282c2aa98e2SPeter Wemm
283c2aa98e2SPeter Wemm# save Unix-style "From_" lines at top of header?
28406f25ae9SGregory Neil Shapiro_OPTION(SaveFromLine, `confSAVE_FROM_LINES', `False')
285c2aa98e2SPeter Wemm
28640266059SGregory Neil Shapiro# queue file mode (qf files)
28740266059SGregory Neil Shapiro_OPTION(QueueFileMode, `confQUEUE_FILE_MODE', `0600')
28840266059SGregory Neil Shapiro
289c2aa98e2SPeter Wemm# temporary file mode
29006f25ae9SGregory Neil Shapiro_OPTION(TempFileMode, `confTEMP_FILE_MODE', `0600')
291c2aa98e2SPeter Wemm
292c2aa98e2SPeter Wemm# match recipients against GECOS field?
29306f25ae9SGregory Neil Shapiro_OPTION(MatchGECOS, `confMATCH_GECOS', `False')
294c2aa98e2SPeter Wemm
295c2aa98e2SPeter Wemm# maximum hop count
29640266059SGregory Neil Shapiro_OPTION(MaxHopCount, `confMAX_HOP', `25')
297c2aa98e2SPeter Wemm
298c2aa98e2SPeter Wemm# location of help file
29906f25ae9SGregory Neil ShapiroO HelpFile=ifdef(`HELP_FILE', HELP_FILE, `MAIL_SETTINGS_DIR`'helpfile')
300c2aa98e2SPeter Wemm
301c2aa98e2SPeter Wemm# ignore dots as terminators in incoming messages?
30206f25ae9SGregory Neil Shapiro_OPTION(IgnoreDots, `confIGNORE_DOTS', `False')
303c2aa98e2SPeter Wemm
304c2aa98e2SPeter Wemm# name resolver options
30506f25ae9SGregory Neil Shapiro_OPTION(ResolverOptions, `confBIND_OPTS', `+AAONLY')
306c2aa98e2SPeter Wemm
307c2aa98e2SPeter Wemm# deliver MIME-encapsulated error messages?
30806f25ae9SGregory Neil Shapiro_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS', `True')
309c2aa98e2SPeter Wemm
310c2aa98e2SPeter Wemm# Forward file search path
31106f25ae9SGregory Neil Shapiro_OPTION(ForwardPath, `confFORWARD_PATH', `/var/forward/$u:$z/.forward.$w:$z/.forward')
312c2aa98e2SPeter Wemm
313c2aa98e2SPeter Wemm# open connection cache size
31406f25ae9SGregory Neil Shapiro_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', `2')
315c2aa98e2SPeter Wemm
316c2aa98e2SPeter Wemm# open connection cache timeout
31706f25ae9SGregory Neil Shapiro_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', `5m')
318c2aa98e2SPeter Wemm
319c2aa98e2SPeter Wemm# persistent host status directory
32006f25ae9SGregory Neil Shapiro_OPTION(HostStatusDirectory, `confHOST_STATUS_DIRECTORY', `.hoststat')
321c2aa98e2SPeter Wemm
322c2aa98e2SPeter Wemm# single thread deliveries (requires HostStatusDirectory)?
32306f25ae9SGregory Neil Shapiro_OPTION(SingleThreadDelivery, `confSINGLE_THREAD_DELIVERY', `False')
324c2aa98e2SPeter Wemm
325c2aa98e2SPeter Wemm# use Errors-To: header?
32606f25ae9SGregory Neil Shapiro_OPTION(UseErrorsTo, `confUSE_ERRORS_TO', `False')
327c2aa98e2SPeter Wemm
328c2aa98e2SPeter Wemm# log level
32906f25ae9SGregory Neil Shapiro_OPTION(LogLevel, `confLOG_LEVEL', `10')
330c2aa98e2SPeter Wemm
331c2aa98e2SPeter Wemm# send to me too, even in an alias expansion?
33206f25ae9SGregory Neil Shapiro_OPTION(MeToo, `confME_TOO', `True')
333c2aa98e2SPeter Wemm
334c2aa98e2SPeter Wemm# verify RHS in newaliases?
33506f25ae9SGregory Neil Shapiro_OPTION(CheckAliases, `confCHECK_ALIASES', `False')
336c2aa98e2SPeter Wemm
337c2aa98e2SPeter Wemm# default messages to old style headers if no special punctuation?
33806f25ae9SGregory Neil Shapiro_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS', `False')
339c2aa98e2SPeter Wemm
340c2aa98e2SPeter Wemm# SMTP daemon options
34106f25ae9SGregory Neil Shapiroifelse(defn(`confDAEMON_OPTIONS'), `', `dnl',
342605302a5SGregory Neil Shapiro`errprint(WARNING: `confDAEMON_OPTIONS' is no longer valid.
343605302a5SGregory Neil Shapiro	Use `DAEMON_OPTIONS()'; see cf/README.
34406f25ae9SGregory Neil Shapiro)'dnl
34506f25ae9SGregory Neil Shapiro`DAEMON_OPTIONS(`confDAEMON_OPTIONS')')
34642e5d165SGregory Neil Shapiroifelse(defn(`_DPO_'), `',
34740266059SGregory Neil Shapiro`ifdef(`_NETINET6_', `O DaemonPortOptions=Name=MTA-v4, Family=inet
34840266059SGregory Neil ShapiroO DaemonPortOptions=Name=MTA-v6, Family=inet6',`O DaemonPortOptions=Name=MTA')', `_DPO_')
34906f25ae9SGregory Neil Shapiroifdef(`_NO_MSA_', `dnl', `O DaemonPortOptions=Port=587, Name=MSA, M=E')
35006f25ae9SGregory Neil Shapiro
35106f25ae9SGregory Neil Shapiro# SMTP client options
35240266059SGregory Neil Shapiroifelse(defn(`confCLIENT_OPTIONS'), `', `dnl',
35340266059SGregory Neil Shapiro`errprint(WARNING: `confCLIENT_OPTIONS' is no longer valid.  See cf/README for more information.
35440266059SGregory Neil Shapiro)'dnl
35540266059SGregory Neil Shapiro`CLIENT_OPTIONS(`confCLIENT_OPTIONS')')
35640266059SGregory Neil Shapiroifelse(defn(`_CPO_'), `',
35740266059SGregory Neil Shapiro`#O ClientPortOptions=Family=inet, Address=0.0.0.0', `_CPO_')
35840266059SGregory Neil Shapiro
35940266059SGregory Neil Shapiro# Modifiers to `define' {daemon_flags} for direct submissions
36040266059SGregory Neil Shapiro_OPTION(DirectSubmissionModifiers, `confDIRECT_SUBMISSION_MODIFIERS', `')
36140266059SGregory Neil Shapiro
36240266059SGregory Neil Shapiro# Use as mail submission program? See sendmail/SECURITY
36340266059SGregory Neil Shapiro_OPTION(UseMSP, `confUSE_MSP', `')
364c2aa98e2SPeter Wemm
365c2aa98e2SPeter Wemm# privacy flags
36606f25ae9SGregory Neil Shapiro_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', `authwarnings')
367c2aa98e2SPeter Wemm
368c2aa98e2SPeter Wemm# who (if anyone) should get extra copies of error messages
36906f25ae9SGregory Neil Shapiro_OPTION(PostmasterCopy, `confCOPY_ERRORS_TO', `Postmaster')
370c2aa98e2SPeter Wemm
371c2aa98e2SPeter Wemm# slope of queue-only function
37206f25ae9SGregory Neil Shapiro_OPTION(QueueFactor, `confQUEUE_FACTOR', `600000')
373c2aa98e2SPeter Wemm
37440266059SGregory Neil Shapiro# limit on number of concurrent queue runners
37540266059SGregory Neil Shapiro_OPTION(MaxQueueChildren, `confMAX_QUEUE_CHILDREN', `')
37640266059SGregory Neil Shapiro
37740266059SGregory Neil Shapiro# maximum number of queue-runners per queue-grouping with multiple queues
37840266059SGregory Neil Shapiro_OPTION(MaxRunnersPerQueue, `confMAX_RUNNERS_PER_QUEUE', `1')
37940266059SGregory Neil Shapiro
38040266059SGregory Neil Shapiro# priority of queue runners (nice(3))
38140266059SGregory Neil Shapiro_OPTION(NiceQueueRun, `confNICE_QUEUE_RUN', `')
38240266059SGregory Neil Shapiro
38340266059SGregory Neil Shapiro# shall we sort the queue by hostname first?
38440266059SGregory Neil Shapiro_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', `priority')
38540266059SGregory Neil Shapiro
38640266059SGregory Neil Shapiro# minimum time in queue before retry
38740266059SGregory Neil Shapiro_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', `30m')
38840266059SGregory Neil Shapiro
38940266059SGregory Neil Shapiro# how many jobs can you process in the queue?
39040266059SGregory Neil Shapiro_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', `10000')
39140266059SGregory Neil Shapiro
39240266059SGregory Neil Shapiro# perform initial split of envelope without checking MX records
39340266059SGregory Neil Shapiro_OPTION(FastSplit, `confFAST_SPLIT', `1')
39440266059SGregory Neil Shapiro
395c2aa98e2SPeter Wemm# queue directory
39606f25ae9SGregory Neil ShapiroO QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, `/var/spool/mqueue')
397c2aa98e2SPeter Wemm
39840266059SGregory Neil Shapiro# key for shared memory; 0 to turn off
39940266059SGregory Neil Shapiro_OPTION(SharedMemoryKey, `confSHARED_MEMORY_KEY', `0')
40040266059SGregory Neil Shapiro
401605302a5SGregory Neil Shapiroifdef(`confSHARED_MEMORY_KEY_FILE', `dnl
402605302a5SGregory Neil Shapiro# file to store key for shared memory (if SharedMemoryKey = -1)
403605302a5SGregory Neil ShapiroO 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')
4275ef517c0SGregory Neil Shapiroifdef(`confTO_QUEUERETURN_DSN', `dnl
4285ef517c0SGregory Neil ShapiroO Timeout.queuereturn.dsn=confTO_QUEUERETURN_DSN')
42906f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', `4h')
43006f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', `4h')
43106f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', `1h')
43206f25ae9SGregory Neil Shapiro_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', `12h')
4335ef517c0SGregory Neil Shapiroifdef(`confTO_QUEUEWARN_DSN', `dnl
4345ef517c0SGregory Neil ShapiroO Timeout.queuewarn.dsn=confTO_QUEUEWARN_DSN')
43506f25ae9SGregory Neil Shapiro_OPTION(Timeout.hoststatus, `confTO_HOSTSTATUS', `30m')
43606f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retrans, `confTO_RESOLVER_RETRANS', `5s')
43706f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retrans.first, `confTO_RESOLVER_RETRANS_FIRST', `5s')
43806f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retrans.normal, `confTO_RESOLVER_RETRANS_NORMAL', `5s')
43906f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retry, `confTO_RESOLVER_RETRY', `4')
44006f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retry.first, `confTO_RESOLVER_RETRY_FIRST', `4')
44106f25ae9SGregory Neil Shapiro_OPTION(Timeout.resolver.retry.normal, `confTO_RESOLVER_RETRY_NORMAL', `4')
44240266059SGregory Neil Shapiro_OPTION(Timeout.lhlo, `confTO_LHLO', `2m')
44340266059SGregory Neil Shapiro_OPTION(Timeout.auth, `confTO_AUTH', `10m')
44440266059SGregory Neil Shapiro_OPTION(Timeout.starttls, `confTO_STARTTLS', `1h')
44540266059SGregory Neil Shapiro
44640266059SGregory Neil Shapiro# time for DeliverBy; extension disabled if less than 0
44740266059SGregory Neil Shapiro_OPTION(DeliverByMin, `confDELIVER_BY_MIN', `0')
448c2aa98e2SPeter Wemm
449c2aa98e2SPeter Wemm# should we not prune routes in route-addr syntax addresses?
45006f25ae9SGregory Neil Shapiro_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES', `False')
451c2aa98e2SPeter Wemm
452c2aa98e2SPeter Wemm# queue up everything before forking?
45306f25ae9SGregory Neil Shapiro_OPTION(SuperSafe, `confSAFE_QUEUE', `True')
454c2aa98e2SPeter Wemm
455c2aa98e2SPeter Wemm# status file
45606f25ae9SGregory Neil ShapiroO StatusFile=ifdef(`STATUS_FILE', `STATUS_FILE', `MAIL_SETTINGS_DIR`'statistics')
457c2aa98e2SPeter Wemm
458c2aa98e2SPeter Wemm# time zone handling:
459c2aa98e2SPeter Wemm#  if undefined, use system default
460c2aa98e2SPeter Wemm#  if defined but null, use TZ envariable passed in
461c2aa98e2SPeter Wemm#  if defined and non-null, use that info
462c2aa98e2SPeter Wemmifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=',
463c2aa98e2SPeter Wemm	confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=',
464c2aa98e2SPeter Wemm	`O TimeZoneSpec=confTIME_ZONE')
465c2aa98e2SPeter Wemm
466c2aa98e2SPeter Wemm# default UID (can be username or userid:groupid)
46706f25ae9SGregory Neil Shapiro_OPTION(DefaultUser, `confDEF_USER_ID', `mailnull')
468c2aa98e2SPeter Wemm
469c2aa98e2SPeter Wemm# list of locations of user database file (null means no lookup)
47006f25ae9SGregory Neil Shapiro_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', `MAIL_SETTINGS_DIR`'userdb')
471c2aa98e2SPeter Wemm
472c2aa98e2SPeter Wemm# fallback MX host
47306f25ae9SGregory Neil Shapiro_OPTION(FallbackMXhost, `confFALLBACK_MX', `fall.back.host.net')
474c2aa98e2SPeter Wemm
475c2aa98e2SPeter Wemm# if we are the best MX host for a site, try it directly instead of config err
47606f25ae9SGregory Neil Shapiro_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST', `False')
477c2aa98e2SPeter Wemm
478c2aa98e2SPeter Wemm# load average at which we just queue messages
47906f25ae9SGregory Neil Shapiro_OPTION(QueueLA, `confQUEUE_LA', `8')
480c2aa98e2SPeter Wemm
481c2aa98e2SPeter Wemm# load average at which we refuse connections
48206f25ae9SGregory Neil Shapiro_OPTION(RefuseLA, `confREFUSE_LA', `12')
483c2aa98e2SPeter Wemm
48440266059SGregory Neil Shapiro# load average at which we delay connections; 0 means no limit
48540266059SGregory Neil Shapiro_OPTION(DelayLA, `confDELAY_LA', `0')
48640266059SGregory Neil Shapiro
487c2aa98e2SPeter Wemm# maximum number of children we allow at one time
488739ac4d4SGregory Neil Shapiro_OPTION(MaxDaemonChildren, `confMAX_DAEMON_CHILDREN', `0')
489c2aa98e2SPeter Wemm
490c2aa98e2SPeter Wemm# maximum number of new connections per second
491193538b7SGregory Neil Shapiro_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', `0')
492c2aa98e2SPeter Wemm
493c2aa98e2SPeter Wemm# work recipient factor
49406f25ae9SGregory Neil Shapiro_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', `30000')
495c2aa98e2SPeter Wemm
496c2aa98e2SPeter Wemm# deliver each queued job in a separate process?
49706f25ae9SGregory Neil Shapiro_OPTION(ForkEachJob, `confSEPARATE_PROC', `False')
498c2aa98e2SPeter Wemm
499c2aa98e2SPeter Wemm# work class factor
50006f25ae9SGregory Neil Shapiro_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', `1800')
501c2aa98e2SPeter Wemm
502c2aa98e2SPeter Wemm# work time factor
50306f25ae9SGregory Neil Shapiro_OPTION(RetryFactor, `confWORK_TIME_FACTOR', `90000')
504c2aa98e2SPeter Wemm
505c2aa98e2SPeter Wemm# default character set
50606f25ae9SGregory Neil Shapiro_OPTION(DefaultCharSet, `confDEF_CHAR_SET', `iso-8859-1')
507c2aa98e2SPeter Wemm
50840266059SGregory Neil Shapiro# service switch file (name hardwired on Solaris, Ultrix, OSF/1, others)
50906f25ae9SGregory Neil Shapiro_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', `MAIL_SETTINGS_DIR`'service.switch')
510c2aa98e2SPeter Wemm
511c2aa98e2SPeter Wemm# hosts file (normally /etc/hosts)
51206f25ae9SGregory Neil Shapiro_OPTION(HostsFile, `confHOSTS_FILE', `/etc/hosts')
513c2aa98e2SPeter Wemm
514c2aa98e2SPeter Wemm# dialup line delay on connection failure
51506f25ae9SGregory Neil Shapiro_OPTION(DialDelay, `confDIAL_DELAY', `10s')
516c2aa98e2SPeter Wemm
517c2aa98e2SPeter Wemm# action to take if there are no recipients in the message
51806f25ae9SGregory Neil Shapiro_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', `add-to-undisclosed')
519c2aa98e2SPeter Wemm
520c2aa98e2SPeter Wemm# chrooted environment for writing to files
52106f25ae9SGregory Neil Shapiro_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', `/arch')
522c2aa98e2SPeter Wemm
523c2aa98e2SPeter Wemm# are colons OK in addresses?
52406f25ae9SGregory Neil Shapiro_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR', `True')
525c2aa98e2SPeter Wemm
526c2aa98e2SPeter Wemm# shall I avoid expanding CNAMEs (violates protocols)?
52706f25ae9SGregory Neil Shapiro_OPTION(DontExpandCnames, `confDONT_EXPAND_CNAMES', `False')
528c2aa98e2SPeter Wemm
529c2aa98e2SPeter Wemm# SMTP initial login message (old $e macro)
53006f25ae9SGregory Neil Shapiro_OPTION(SmtpGreetingMessage, `confSMTP_LOGIN_MSG', `$j Sendmail $v ready at $b')
531c2aa98e2SPeter Wemm
532c2aa98e2SPeter Wemm# UNIX initial From header format (old $l macro)
53306f25ae9SGregory Neil Shapiro_OPTION(UnixFromLine, `confFROM_LINE', `From $g $d')
534c2aa98e2SPeter Wemm
535c2aa98e2SPeter Wemm# From: lines that have embedded newlines are unwrapped onto one line
53606f25ae9SGregory Neil Shapiro_OPTION(SingleLineFromHeader, `confSINGLE_LINE_FROM_HEADER', `False')
537c2aa98e2SPeter Wemm
538c2aa98e2SPeter Wemm# Allow HELO SMTP command that does not `include' a host name
53906f25ae9SGregory Neil Shapiro_OPTION(AllowBogusHELO, `confALLOW_BOGUS_HELO', `False')
540c2aa98e2SPeter Wemm
541c2aa98e2SPeter Wemm# Characters to be quoted in a full name phrase (@,;:\()[] are automatic)
54206f25ae9SGregory Neil Shapiro_OPTION(MustQuoteChars, `confMUST_QUOTE_CHARS', `.')
543c2aa98e2SPeter Wemm
544c2aa98e2SPeter Wemm# delimiter (operator) characters (old $o macro)
54506f25ae9SGregory Neil Shapiro_OPTION(OperatorChars, `confOPERATORS', `.:@[]')
546c2aa98e2SPeter Wemm
547c2aa98e2SPeter Wemm# shall I avoid calling initgroups(3) because of high NIS costs?
54806f25ae9SGregory Neil Shapiro_OPTION(DontInitGroups, `confDONT_INIT_GROUPS', `False')
549c2aa98e2SPeter Wemm
550c2aa98e2SPeter Wemm# are group-writable `:include:' and .forward files (un)trustworthy?
55140266059SGregory Neil Shapiro# True (the default) means they are not trustworthy.
55206f25ae9SGregory Neil Shapiro_OPTION(UnsafeGroupWrites, `confUNSAFE_GROUP_WRITES', `True')
55340266059SGregory Neil Shapiroifdef(`confUNSAFE_GROUP_WRITES',
55440266059SGregory Neil Shapiro`errprint(`WARNING: confUNSAFE_GROUP_WRITES is deprecated; use confDONT_BLAME_SENDMAIL.
55540266059SGregory Neil Shapiro')')
556c2aa98e2SPeter Wemm
557c2aa98e2SPeter Wemm# where do errors that occur when sending errors get sent?
55806f25ae9SGregory Neil Shapiro_OPTION(DoubleBounceAddress, `confDOUBLE_BOUNCE_ADDRESS', `postmaster')
55906f25ae9SGregory Neil Shapiro
56006f25ae9SGregory Neil Shapiro# where to save bounces if all else fails
56106f25ae9SGregory Neil Shapiro_OPTION(DeadLetterDrop, `confDEAD_LETTER_DROP', `/var/tmp/dead.letter')
562c2aa98e2SPeter Wemm
563c2aa98e2SPeter Wemm# what user id do we assume for the majority of the processing?
56406f25ae9SGregory Neil Shapiro_OPTION(RunAsUser, `confRUN_AS_USER', `sendmail')
565c2aa98e2SPeter Wemm
566c2aa98e2SPeter Wemm# maximum number of recipients per SMTP envelope
56706f25ae9SGregory Neil Shapiro_OPTION(MaxRecipientsPerMessage, `confMAX_RCPTS_PER_MESSAGE', `100')
568c2aa98e2SPeter Wemm
56940266059SGregory Neil Shapiro# limit the rate recipients per SMTP envelope are accepted
57040266059SGregory Neil Shapiro# once the threshold number of recipients have been rejected
57140266059SGregory Neil Shapiro_OPTION(BadRcptThrottle, `confBAD_RCPT_THROTTLE', `20')
57240266059SGregory Neil Shapiro
573c2aa98e2SPeter Wemm# shall we get local names from our installed interfaces?
57406f25ae9SGregory Neil Shapiro_OPTION(DontProbeInterfaces, `confDONT_PROBE_INTERFACES', `False')
575c2aa98e2SPeter Wemm
57606f25ae9SGregory Neil Shapiro# Return-Receipt-To: header implies DSN request
57706f25ae9SGregory Neil Shapiro_OPTION(RrtImpliesDsn, `confRRT_IMPLIES_DSN', `False')
57806f25ae9SGregory Neil Shapiro
57906f25ae9SGregory Neil Shapiro# override connection address (for testing)
58006f25ae9SGregory Neil Shapiro_OPTION(ConnectOnlyTo, `confCONNECT_ONLY_TO', `0.0.0.0')
58106f25ae9SGregory Neil Shapiro
58206f25ae9SGregory Neil Shapiro# Trusted user for file ownership and starting the daemon
58306f25ae9SGregory Neil Shapiro_OPTION(TrustedUser, `confTRUSTED_USER', `root')
58406f25ae9SGregory Neil Shapiro
58506f25ae9SGregory Neil Shapiro# Control socket for daemon management
58606f25ae9SGregory Neil Shapiro_OPTION(ControlSocketName, `confCONTROL_SOCKET_NAME', `/var/spool/mqueue/.control')
58706f25ae9SGregory Neil Shapiro
58806f25ae9SGregory Neil Shapiro# Maximum MIME header length to protect MUAs
5895ef517c0SGregory Neil Shapiro_OPTION(MaxMimeHeaderLength, `confMAX_MIME_HEADER_LENGTH', `2048/1024')
59006f25ae9SGregory Neil Shapiro
59106f25ae9SGregory Neil Shapiro# Maximum length of the sum of all headers
59206f25ae9SGregory Neil Shapiro_OPTION(MaxHeadersLength, `confMAX_HEADERS_LENGTH', `32768')
59306f25ae9SGregory Neil Shapiro
59406f25ae9SGregory Neil Shapiro# Maximum depth of alias recursion
59506f25ae9SGregory Neil Shapiro_OPTION(MaxAliasRecursion, `confMAX_ALIAS_RECURSION', `10')
59606f25ae9SGregory Neil Shapiro
59706f25ae9SGregory Neil Shapiro# location of pid file
59806f25ae9SGregory Neil Shapiro_OPTION(PidFile, `confPID_FILE', `/var/run/sendmail.pid')
59906f25ae9SGregory Neil Shapiro
60006f25ae9SGregory Neil Shapiro# Prefix string for the process title shown on 'ps' listings
60106f25ae9SGregory Neil Shapiro_OPTION(ProcessTitlePrefix, `confPROCESS_TITLE_PREFIX', `prefix')
60206f25ae9SGregory Neil Shapiro
60306f25ae9SGregory Neil Shapiro# Data file (df) memory-buffer file maximum size
60406f25ae9SGregory Neil Shapiro_OPTION(DataFileBufferSize, `confDF_BUFFER_SIZE', `4096')
60506f25ae9SGregory Neil Shapiro
60606f25ae9SGregory Neil Shapiro# Transcript file (xf) memory-buffer file maximum size
60706f25ae9SGregory Neil Shapiro_OPTION(XscriptFileBufferSize, `confXF_BUFFER_SIZE', `4096')
60806f25ae9SGregory Neil Shapiro
60940266059SGregory Neil Shapiro# lookup type to find information about local mailboxes
61040266059SGregory Neil Shapiro_OPTION(MailboxDatabase, `confMAILBOX_DATABASE', `pw')
61140266059SGregory Neil Shapiro
61206f25ae9SGregory Neil Shapiro# list of authentication mechanisms
61340266059SGregory Neil Shapiro_OPTION(AuthMechanisms, `confAUTH_MECHANISMS', `EXTERNAL GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5')
61406f25ae9SGregory Neil Shapiro
61506f25ae9SGregory Neil Shapiro# default authentication information for outgoing connections
61606f25ae9SGregory Neil Shapiro_OPTION(DefaultAuthInfo, `confDEF_AUTH_INFO', `MAIL_SETTINGS_DIR`'default-auth-info')
61706f25ae9SGregory Neil Shapiro
61806f25ae9SGregory Neil Shapiro# SMTP AUTH flags
61906f25ae9SGregory Neil Shapiro_OPTION(AuthOptions, `confAUTH_OPTIONS', `')
62006f25ae9SGregory Neil Shapiro
62140266059SGregory Neil Shapiro# SMTP AUTH maximum encryption strength
62240266059SGregory Neil Shapiro_OPTION(AuthMaxBits, `confAUTH_MAX_BITS', `')
62340266059SGregory Neil Shapiro
62440266059SGregory Neil Shapiro# SMTP STARTTLS server options
62540266059SGregory Neil Shapiro_OPTION(TLSSrvOptions, `confTLS_SRV_OPTIONS', `')
62640266059SGregory Neil Shapiro
62706f25ae9SGregory Neil Shapiro# Input mail filters
62806f25ae9SGregory Neil Shapiro_OPTION(InputMailFilters, `confINPUT_MAIL_FILTERS', `')
62906f25ae9SGregory Neil Shapiro
630739ac4d4SGregory Neil Shapiroifelse(len(X`'_MAIL_FILTERS_DEF), `1', `dnl', `dnl
63106f25ae9SGregory Neil Shapiro# Milter options
63240266059SGregory Neil Shapiro_OPTION(Milter.LogLevel, `confMILTER_LOG_LEVEL', `')
63306f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.connect, `confMILTER_MACROS_CONNECT', `')
63406f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.helo, `confMILTER_MACROS_HELO', `')
63506f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.envfrom, `confMILTER_MACROS_ENVFROM', `')
63606f25ae9SGregory Neil Shapiro_OPTION(Milter.macros.envrcpt, `confMILTER_MACROS_ENVRCPT', `')')
63706f25ae9SGregory Neil Shapiro
63806f25ae9SGregory Neil Shapiro# CA directory
63913bd1963SGregory Neil Shapiro_OPTION(CACertPath, `confCACERT_PATH', `')
64006f25ae9SGregory Neil Shapiro# CA file
64113bd1963SGregory Neil Shapiro_OPTION(CACertFile, `confCACERT', `')
64206f25ae9SGregory Neil Shapiro# Server Cert
64306f25ae9SGregory Neil Shapiro_OPTION(ServerCertFile, `confSERVER_CERT', `')
64406f25ae9SGregory Neil Shapiro# Server private key
64506f25ae9SGregory Neil Shapiro_OPTION(ServerKeyFile, `confSERVER_KEY', `')
64606f25ae9SGregory Neil Shapiro# Client Cert
64706f25ae9SGregory Neil Shapiro_OPTION(ClientCertFile, `confCLIENT_CERT', `')
64806f25ae9SGregory Neil Shapiro# Client private key
64906f25ae9SGregory Neil Shapiro_OPTION(ClientKeyFile, `confCLIENT_KEY', `')
65006f25ae9SGregory Neil Shapiro# DHParameters (only required if DSA/DH is used)
65106f25ae9SGregory Neil Shapiro_OPTION(DHParameters, `confDH_PARAMETERS', `')
65206f25ae9SGregory Neil Shapiro# Random data source (required for systems without /dev/urandom under OpenSSL)
65306f25ae9SGregory Neil Shapiro_OPTION(RandFile, `confRAND_FILE', `')
65406f25ae9SGregory Neil Shapiro
65540266059SGregory Neil Shapiro############################
65640266059SGregory Neil Shapiro`# QUEUE GROUP DEFINITIONS  #'
65740266059SGregory Neil Shapiro############################
65840266059SGregory Neil Shapiro_QUEUE_GROUP_
659065a643dSPeter Wemm
660c2aa98e2SPeter Wemm###########################
661c2aa98e2SPeter Wemm#   Message precedences   #
662c2aa98e2SPeter Wemm###########################
663c2aa98e2SPeter Wemm
664c2aa98e2SPeter WemmPfirst-class=0
665c2aa98e2SPeter WemmPspecial-delivery=100
666c2aa98e2SPeter WemmPlist=-30
667c2aa98e2SPeter WemmPbulk=-60
668c2aa98e2SPeter WemmPjunk=-100
669c2aa98e2SPeter Wemm
670c2aa98e2SPeter Wemm#####################
671c2aa98e2SPeter Wemm#   Trusted users   #
672c2aa98e2SPeter Wemm#####################
673c2aa98e2SPeter Wemm
674c2aa98e2SPeter Wemm# this is equivalent to setting class "t"
67506f25ae9SGregory Neil Shapiroifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, `MAIL_SETTINGS_DIR`'trusted-users')
676c2aa98e2SPeter WemmTroot
677c2aa98e2SPeter WemmTdaemon
678c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', `Tuucp')
679c2aa98e2SPeter Wemmifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl')
680c2aa98e2SPeter Wemm
681c2aa98e2SPeter Wemm#########################
682c2aa98e2SPeter Wemm#   Format of headers   #
683c2aa98e2SPeter Wemm#########################
684c2aa98e2SPeter Wemm
685c2aa98e2SPeter Wemmifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl
686c2aa98e2SPeter WemmH?P?Return-Path: <$g>
687c2aa98e2SPeter WemmHReceived: confRECEIVED_HEADER
688c2aa98e2SPeter WemmH?D?Resent-Date: $a
689c2aa98e2SPeter WemmH?D?Date: $a
690c2aa98e2SPeter WemmH?F?Resent-From: confFROM_HEADER
691c2aa98e2SPeter WemmH?F?From: confFROM_HEADER
692c2aa98e2SPeter WemmH?x?Full-Name: $x
693c2aa98e2SPeter Wemm# HPosted-Date: $a
694c2aa98e2SPeter Wemm# H?l?Received-Date: $b
695c2aa98e2SPeter WemmH?M?Resent-Message-Id: <$t.$i@$j>
696c2aa98e2SPeter WemmH?M?Message-Id: <$t.$i@$j>
69706f25ae9SGregory Neil Shapiro
698c2aa98e2SPeter Wemm#
699c2aa98e2SPeter Wemm######################################################################
700c2aa98e2SPeter Wemm######################################################################
701c2aa98e2SPeter Wemm#####
702c2aa98e2SPeter Wemm#####			REWRITING RULES
703c2aa98e2SPeter Wemm#####
704c2aa98e2SPeter Wemm######################################################################
705c2aa98e2SPeter Wemm######################################################################
706c2aa98e2SPeter Wemm
707c2aa98e2SPeter Wemm############################################
708c2aa98e2SPeter Wemm###  Ruleset 3 -- Name Canonicalization  ###
709c2aa98e2SPeter Wemm############################################
71006f25ae9SGregory Neil ShapiroScanonify=3
711c2aa98e2SPeter Wemm
712c2aa98e2SPeter Wemm# handle null input (translate to <@> special case)
713c2aa98e2SPeter WemmR$@			$@ <@>
714c2aa98e2SPeter Wemm
715c2aa98e2SPeter Wemm# strip group: syntax (not inside angle brackets!) and trailing semicolon
716c2aa98e2SPeter WemmR$*			$: $1 <@>			mark addresses
717c2aa98e2SPeter WemmR$* < $* > $* <@>	$: $1 < $2 > $3			unmark <addr>
718c2aa98e2SPeter WemmR@ $* <@>		$: @ $1				unmark @host:...
71940266059SGregory Neil ShapiroR$* [ IPv6 : $+ ] <@>	$: $1 [ IPv6 : $2 ]		unmark IPv6 addr
720c2aa98e2SPeter WemmR$* :: $* <@>		$: $1 :: $2			unmark node::addr
721c2aa98e2SPeter WemmR:`include': $* <@>	$: :`include': $1			unmark :`include':...
722c2aa98e2SPeter WemmR$* : $* [ $* ]		$: $1 : $2 [ $3 ] <@>		remark if leading colon
723c2aa98e2SPeter WemmR$* : $* <@>		$: $2				strip colon if marked
724c2aa98e2SPeter WemmR$* <@>			$: $1				unmark
725c2aa98e2SPeter WemmR$* ;			   $1				strip trailing semi
726193538b7SGregory Neil ShapiroR$* < $+ :; > $*	$@ $2 :; <@>			catch <list:;>
727c2aa98e2SPeter WemmR$* < $* ; >		   $1 < $2 >			bogus bracketed semi
728c2aa98e2SPeter Wemm
729c2aa98e2SPeter Wemm# null input now results from list:; syntax
730c2aa98e2SPeter WemmR$@			$@ :; <@>
731c2aa98e2SPeter Wemm
732c2aa98e2SPeter Wemm# strip angle brackets -- note RFC733 heuristic to get innermost item
733c2aa98e2SPeter WemmR$*			$: < $1 >			housekeeping <>
734c2aa98e2SPeter WemmR$+ < $* >		   < $2 >			strip excess on left
735c2aa98e2SPeter WemmR< $* > $+		   < $1 >			strip excess on right
736c2aa98e2SPeter WemmR<>			$@ < @ >			MAIL FROM:<> case
737c2aa98e2SPeter WemmR< $+ >			$: $1				remove housekeeping <>
738c2aa98e2SPeter Wemm
73906f25ae9SGregory Neil Shapiroifdef(`_USE_DEPRECATED_ROUTE_ADDR_',`dnl
740c2aa98e2SPeter Wemm# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later
741c2aa98e2SPeter WemmR@ $+ , $+		@ $1 : $2			change all "," to ":"
742c2aa98e2SPeter Wemm
743c2aa98e2SPeter Wemm# localize and dispose of route-based addresses
74440266059SGregory Neil Shapirodnl XXX: IPv6 colon conflict
74540266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl',
74640266059SGregory Neil Shapiro`R@ [$+] : $+		$@ $>Canonify2 < @ [$1] > : $2	handle <route-addr>')
74706f25ae9SGregory Neil ShapiroR@ $+ : $+		$@ $>Canonify2 < @$1 > : $2	handle <route-addr>
74806f25ae9SGregory Neil Shapirodnl',`dnl
74906f25ae9SGregory Neil Shapiro# strip route address <@a,@b,@c:user@d> -> <user@d>
75006f25ae9SGregory Neil ShapiroR@ $+ , $+		$2
75140266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl',
75240266059SGregory Neil Shapiro`R@ [ $* ] : $+		$2')
75306f25ae9SGregory Neil ShapiroR@ $+ : $+		$2
75406f25ae9SGregory Neil Shapirodnl')
755c2aa98e2SPeter Wemm
756c2aa98e2SPeter Wemm# find focus for list syntax
75706f25ae9SGregory Neil ShapiroR $+ : $* ; @ $+	$@ $>Canonify2 $1 : $2 ; < @ $3 >	list syntax
758c2aa98e2SPeter WemmR $+ : $* ;		$@ $1 : $2;			list syntax
759c2aa98e2SPeter Wemm
760c2aa98e2SPeter Wemm# find focus for @ syntax addresses
761c2aa98e2SPeter WemmR$+ @ $+		$: $1 < @ $2 >			focus on domain
762c2aa98e2SPeter WemmR$+ < $+ @ $+ >		$1 $2 < @ $3 >			move gaze right
76306f25ae9SGregory Neil ShapiroR$+ < @ $+ >		$@ $>Canonify2 $1 < @ $2 >	already canonical
764c2aa98e2SPeter Wemm
76540266059SGregory Neil Shapirodnl This is flagged as an error in S0; no need to silently fix it here.
76640266059SGregory Neil Shapirodnl # do some sanity checking
76740266059SGregory Neil Shapirodnl R$* < @ $~[ $* : $* > $*	$1 < @ $2 $3 > $4	nix colons in addrs
768c2aa98e2SPeter Wemm
769c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl',
770c2aa98e2SPeter Wemm`# convert old-style addresses to a domain-based address
77106f25ae9SGregory Neil ShapiroR$- ! $+		$@ $>Canonify2 $2 < @ $1 .UUCP >	resolve uucp names
77206f25ae9SGregory Neil ShapiroR$+ . $- ! $+		$@ $>Canonify2 $3 < @ $1 . $2 >		domain uucps
77306f25ae9SGregory Neil ShapiroR$+ ! $+		$@ $>Canonify2 $2 < @ $1 .UUCP >	uucp subdomains
774c2aa98e2SPeter Wemm')
775c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_',
776c2aa98e2SPeter Wemm`# convert node::user addresses into a domain-based address
77706f25ae9SGregory Neil ShapiroR$- :: $+		$@ $>Canonify2 $2 < @ $1 .DECNET >	resolve DECnet names
77806f25ae9SGregory Neil ShapiroR$- . $- :: $+		$@ $>Canonify2 $3 < @ $1.$2 .DECNET >	numeric DECnet addr
779c2aa98e2SPeter Wemm',
780c2aa98e2SPeter Wemm	`dnl')
781c2aa98e2SPeter Wemm# if we have % signs, take the rightmost one
782c2aa98e2SPeter WemmR$* % $*		$1 @ $2				First make them all @s.
783c2aa98e2SPeter WemmR$* @ $* @ $*		$1 % $2 @ $3			Undo all but the last.
78406f25ae9SGregory Neil ShapiroR$* @ $*		$@ $>Canonify2 $1 < @ $2 >	Insert < > and finish
785c2aa98e2SPeter Wemm
786c2aa98e2SPeter Wemm# else we must be a local name
78706f25ae9SGregory Neil ShapiroR$*			$@ $>Canonify2 $1
788c2aa98e2SPeter Wemm
789c2aa98e2SPeter Wemm
790c2aa98e2SPeter Wemm################################################
791c2aa98e2SPeter Wemm###  Ruleset 96 -- bottom half of ruleset 3  ###
792c2aa98e2SPeter Wemm################################################
793c2aa98e2SPeter Wemm
79406f25ae9SGregory Neil ShapiroSCanonify2=96
795c2aa98e2SPeter Wemm
796c2aa98e2SPeter Wemm# handle special cases for local names
797c2aa98e2SPeter WemmR$* < @ localhost > $*		$: $1 < @ $j . > $2		no domain at all
798c2aa98e2SPeter WemmR$* < @ localhost . $m > $*	$: $1 < @ $j . > $2		local domain
799c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl',
800c2aa98e2SPeter Wemm`R$* < @ localhost . UUCP > $*	$: $1 < @ $j . > $2		.UUCP domain')
80106f25ae9SGregory Neil Shapiro
80240266059SGregory Neil Shapiro# check for IPv4/IPv6 domain literal
80340266059SGregory Neil ShapiroR$* < @ [ $+ ] > $*		$: $1 < @@ [ $2 ] > $3		mark [addr]
804c2aa98e2SPeter WemmR$* < @@ $=w > $*		$: $1 < @ $j . > $3		self-literal
805c2aa98e2SPeter WemmR$* < @@ $+ > $*		$@ $1 < @ $2 > $3		canon IP addr
806c2aa98e2SPeter Wemm
80706f25ae9SGregory Neil Shapiroifdef(`_DOMAIN_TABLE_', `dnl
808c2aa98e2SPeter Wemm# look up domains in the domain table
809c2aa98e2SPeter WemmR$* < @ $+ > $* 		$: $1 < @ $(domaintable $2 $) > $3', `dnl')
810c2aa98e2SPeter Wemm
81106f25ae9SGregory Neil Shapiroundivert(2)dnl LOCAL_RULE_3
812c2aa98e2SPeter Wemm
81306f25ae9SGregory Neil Shapiroifdef(`_BITDOMAIN_TABLE_', `dnl
814c2aa98e2SPeter Wemm# handle BITNET mapping
815c2aa98e2SPeter WemmR$* < @ $+ .BITNET > $*		$: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3', `dnl')
816c2aa98e2SPeter Wemm
81706f25ae9SGregory Neil Shapiroifdef(`_UUDOMAIN_TABLE_', `dnl
818c2aa98e2SPeter Wemm# handle UUCP mapping
819c2aa98e2SPeter WemmR$* < @ $+ .UUCP > $*		$: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3', `dnl')
820c2aa98e2SPeter Wemm
821c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl',
822c2aa98e2SPeter Wemm`ifdef(`UUCP_RELAY',
823c2aa98e2SPeter Wemm`# pass UUCP addresses straight through
824c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $*		$@ $1 < @ $2 . UUCP . > $3',
825c2aa98e2SPeter Wemm`# if really UUCP, handle it immediately
826c2aa98e2SPeter Wemmifdef(`_CLASS_U_',
827c2aa98e2SPeter Wemm`R$* < @ $=U . UUCP > $*	$@ $1 < @ $2 . UUCP . > $3', `dnl')
828c2aa98e2SPeter Wemmifdef(`_CLASS_V_',
829c2aa98e2SPeter Wemm`R$* < @ $=V . UUCP > $*	$@ $1 < @ $2 . UUCP . > $3', `dnl')
830c2aa98e2SPeter Wemmifdef(`_CLASS_W_',
831c2aa98e2SPeter Wemm`R$* < @ $=W . UUCP > $*	$@ $1 < @ $2 . UUCP . > $3', `dnl')
832c2aa98e2SPeter Wemmifdef(`_CLASS_X_',
833c2aa98e2SPeter Wemm`R$* < @ $=X . UUCP > $*	$@ $1 < @ $2 . UUCP . > $3', `dnl')
834c2aa98e2SPeter Wemmifdef(`_CLASS_Y_',
835c2aa98e2SPeter Wemm`R$* < @ $=Y . UUCP > $*	$@ $1 < @ $2 . UUCP . > $3', `dnl')
836c2aa98e2SPeter Wemm
837c2aa98e2SPeter Wemmifdef(`_NO_CANONIFY_', `dnl', `dnl
838c2aa98e2SPeter Wemm# try UUCP traffic as a local address
839c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $*		$: $1 < @ $[ $2 $] . UUCP . > $3
840c2aa98e2SPeter WemmR$* < @ $+ . . UUCP . > $*	$@ $1 < @ $2 . > $3')
841c2aa98e2SPeter Wemm')')
84206f25ae9SGregory Neil Shapiro# hostnames ending in class P are always canonical
84306f25ae9SGregory Neil ShapiroR$* < @ $* $=P > $*		$: $1 < @ $2 $3 . > $4
84406f25ae9SGregory Neil Shapirodnl apply the next rule only for hostnames not in class P
84506f25ae9SGregory Neil Shapirodnl this even works for phrases in class P since . is in class P
84606f25ae9SGregory Neil Shapirodnl which daemon flags are set?
84706f25ae9SGregory Neil ShapiroR$* < @ $* $~P > $*		$: $&{daemon_flags} $| $1 < @ $2 $3 > $4
84806f25ae9SGregory Neil Shapirodnl the other rules in this section only apply if the hostname
84906f25ae9SGregory Neil Shapirodnl does not end in class P hence no further checks are done here
85006f25ae9SGregory Neil Shapirodnl if this ever changes make sure the lookups are "protected" again!
85106f25ae9SGregory Neil Shapiroifdef(`_NO_CANONIFY_', `dnl
85206f25ae9SGregory Neil Shapirodnl do not canonify unless:
85306f25ae9SGregory Neil Shapirodnl domain ends in class {Canonify} (this does not work if the intersection
85406f25ae9SGregory Neil Shapirodnl	with class P is non-empty)
85506f25ae9SGregory Neil Shapirodnl or {daemon_flags} has c set
85606f25ae9SGregory Neil Shapiro# pass to name server to make hostname canonical if in class {Canonify}
85706f25ae9SGregory Neil ShapiroR$* $| $* < @ $* $={Canonify} > $*	$: $2 < @ $[ $3 $4 $] > $5
85806f25ae9SGregory Neil Shapiro# pass to name server to make hostname canonical if requested
85906f25ae9SGregory Neil ShapiroR$* c $* $| $* < @ $* > $*	$: $3 < @ $[ $4 $] > $5
86006f25ae9SGregory Neil Shapirodnl trailing dot? -> do not apply _CANONIFY_HOSTS_
86106f25ae9SGregory Neil ShapiroR$* $| $* < @ $+ . > $*		$: $2 < @ $3 . > $4
86206f25ae9SGregory Neil Shapiro# add a trailing dot to qualified hostnames so other rules will work
86306f25ae9SGregory Neil ShapiroR$* $| $* < @ $+.$+ > $*	$: $2 < @ $3.$4 . > $5
86406f25ae9SGregory Neil Shapiroifdef(`_CANONIFY_HOSTS_', `dnl
86506f25ae9SGregory Neil Shapirodnl this should only apply to unqualified hostnames
86606f25ae9SGregory Neil Shapirodnl but if a valid character inside an unqualified hostname is an OperatorChar
86706f25ae9SGregory Neil Shapirodnl then $- does not work.
86806f25ae9SGregory Neil Shapiro# lookup unqualified hostnames
86906f25ae9SGregory Neil ShapiroR$* $| $* < @ $* > $*		$: $2 < @ $[ $3 $] > $4', `dnl')', `dnl
87006f25ae9SGregory Neil Shapirodnl _NO_CANONIFY_ is not set: canonify unless:
87106f25ae9SGregory Neil Shapirodnl {daemon_flags} contains CC (do not canonify)
872193538b7SGregory Neil Shapirodnl but add a trailing dot to qualified hostnames so other rules will work
873193538b7SGregory Neil Shapirodnl should we do this for every hostname: even unqualified?
874193538b7SGregory Neil ShapiroR$* CC $* $| $* < @ $+.$+ > $*	$: $3 < @ $4.$5 . > $6
87506f25ae9SGregory Neil ShapiroR$* CC $* $| $*			$: $3
87640266059SGregory Neil Shapiroifdef(`_FFR_NOCANONIFY_HEADERS', `dnl
87740266059SGregory Neil Shapiro# do not canonify header addresses
87840266059SGregory Neil ShapiroR$* $| $* < @ $* $~P > $*	$: $&{addr_type} $| $2 < @ $3 $4 > $5
87940266059SGregory Neil ShapiroR$* h $* $| $* < @ $+.$+ > $*	$: $3 < @ $4.$5 . > $6
88040266059SGregory Neil ShapiroR$* h $* $| $*			$: $3', `dnl')
881c2aa98e2SPeter Wemm# pass to name server to make hostname canonical
88206f25ae9SGregory Neil ShapiroR$* $| $* < @ $* > $*		$: $2 < @ $[ $3 $] > $4')
88306f25ae9SGregory Neil Shapirodnl remove {daemon_flags} for other cases
88406f25ae9SGregory Neil ShapiroR$* $| $*			$: $2
885c2aa98e2SPeter Wemm
886c2aa98e2SPeter Wemm# local host aliases and pseudo-domains are always canonical
887c2aa98e2SPeter WemmR$* < @ $=w > $*		$: $1 < @ $2 . > $3
888c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_',
889c2aa98e2SPeter Wemm`R$* < @ $* $=M > $*		$: $1 < @ $2 $3 . > $4',
890c2aa98e2SPeter Wemm`R$* < @ $=M > $*		$: $1 < @ $2 . > $3')
89106f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_TABLE_', `dnl
89206f25ae9SGregory Neil Shapirodnl virtual hosts are also canonical
89306f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_ENTIRE_DOMAIN_',
89406f25ae9SGregory Neil Shapiro`R$* < @ $* $={VirtHost} > $* 	$: $1 < @ $2 $3 . > $4',
89506f25ae9SGregory Neil Shapiro`R$* < @ $={VirtHost} > $* 	$: $1 < @ $2 . > $3')',
89606f25ae9SGregory Neil Shapiro`dnl')
89740266059SGregory Neil Shapiroifdef(`_GENERICS_TABLE_', `dnl
89840266059SGregory Neil Shapirodnl hosts for genericstable are also canonical
89940266059SGregory Neil Shapiroifdef(`_GENERICS_ENTIRE_DOMAIN_',
90040266059SGregory Neil Shapiro`R$* < @ $* $=G > $* 	$: $1 < @ $2 $3 . > $4',
90140266059SGregory Neil Shapiro`R$* < @ $=G > $* 	$: $1 < @ $2 . > $3')',
90240266059SGregory Neil Shapiro`dnl')
90306f25ae9SGregory Neil Shapirodnl remove superfluous dots (maybe repeatedly) which may have been added
90406f25ae9SGregory Neil Shapirodnl by one of the rules before
905c2aa98e2SPeter WemmR$* < @ $* . . > $*		$1 < @ $2 . > $3
906c2aa98e2SPeter Wemm
907c2aa98e2SPeter Wemm
908c2aa98e2SPeter Wemm##################################################
909c2aa98e2SPeter Wemm###  Ruleset 4 -- Final Output Post-rewriting  ###
910c2aa98e2SPeter Wemm##################################################
91106f25ae9SGregory Neil ShapiroSfinal=4
912c2aa98e2SPeter Wemm
913193538b7SGregory Neil ShapiroR$+ :; <@>		$@ $1 :				handle <list:;>
914c2aa98e2SPeter WemmR$* <@>			$@				handle <> and list:;
915c2aa98e2SPeter Wemm
916c2aa98e2SPeter Wemm# strip trailing dot off possibly canonical name
917c2aa98e2SPeter WemmR$* < @ $+ . > $*	$1 < @ $2 > $3
918c2aa98e2SPeter Wemm
91906f25ae9SGregory Neil Shapiro# eliminate internal code
920c2aa98e2SPeter WemmR$* < @ *LOCAL* > $*	$1 < @ $j > $2
921c2aa98e2SPeter Wemm
922c2aa98e2SPeter Wemm# externalize local domain info
923c2aa98e2SPeter WemmR$* < $+ > $*		$1 $2 $3			defocus
924c2aa98e2SPeter WemmR@ $+ : @ $+ : $+	@ $1 , @ $2 : $3		<route-addr> canonical
925c2aa98e2SPeter WemmR@ $*			$@ @ $1				... and exit
926c2aa98e2SPeter Wemm
927c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl',
928c2aa98e2SPeter Wemm`# UUCP must always be presented in old form
929c2aa98e2SPeter WemmR$+ @ $- . UUCP		$2!$1				u@h.UUCP => h!u')
930c2aa98e2SPeter Wemm
931c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_',
932c2aa98e2SPeter Wemm`# put DECnet back in :: form
933c2aa98e2SPeter WemmR$+ @ $+ . DECNET	$2 :: $1			u@h.DECNET => h::u',
934c2aa98e2SPeter Wemm	`dnl')
935c2aa98e2SPeter Wemm# delete duplicate local names
936c2aa98e2SPeter WemmR$+ % $=w @ $=w		$1 @ $2				u%host@host => u@host
937c2aa98e2SPeter Wemm
938c2aa98e2SPeter Wemm
939c2aa98e2SPeter Wemm
940c2aa98e2SPeter Wemm##############################################################
941c2aa98e2SPeter Wemm###   Ruleset 97 -- recanonicalize and call ruleset zero   ###
942c2aa98e2SPeter Wemm###		   (used for recursive calls)		   ###
943c2aa98e2SPeter Wemm##############################################################
944c2aa98e2SPeter Wemm
94506f25ae9SGregory Neil ShapiroSRecurse=97
94606f25ae9SGregory Neil ShapiroR$*			$: $>canonify $1
94706f25ae9SGregory Neil ShapiroR$*			$@ $>parse $1
948c2aa98e2SPeter Wemm
949c2aa98e2SPeter Wemm
950c2aa98e2SPeter Wemm######################################
951c2aa98e2SPeter Wemm###   Ruleset 0 -- Parse Address   ###
952c2aa98e2SPeter Wemm######################################
953c2aa98e2SPeter Wemm
95406f25ae9SGregory Neil ShapiroSparse=0
955c2aa98e2SPeter Wemm
956c2aa98e2SPeter WemmR$*			$: $>Parse0 $1		initial parsing
957c2aa98e2SPeter WemmR<@>			$#_LOCAL_ $: <@>		special case error msgs
95806f25ae9SGregory Neil ShapiroR$*			$: $>ParseLocal $1	handle local hacks
959c2aa98e2SPeter WemmR$*			$: $>Parse1 $1		final parsing
960c2aa98e2SPeter Wemm
961c2aa98e2SPeter Wemm#
962c2aa98e2SPeter Wemm#  Parse0 -- do initial syntax checking and eliminate local addresses.
963c2aa98e2SPeter Wemm#	This should either return with the (possibly modified) input
964c2aa98e2SPeter Wemm#	or return with a #error mailer.  It should not return with a
965c2aa98e2SPeter Wemm#	#mailer other than the #error mailer.
966c2aa98e2SPeter Wemm#
967c2aa98e2SPeter Wemm
968c2aa98e2SPeter WemmSParse0
969c2aa98e2SPeter WemmR<@>			$@ <@>			special case error msgs
97040266059SGregory Neil ShapiroR$* : $* ; <@>		$#error $@ 5.1.3 $: "_CODE553 List:; syntax illegal for recipient addresses"
97106f25ae9SGregory Neil ShapiroR@ <@ $* >		< @ $1 >		catch "@@host" bogosity
97240266059SGregory Neil ShapiroR<@ $+>			$#error $@ 5.1.3 $: "_CODE553 User address required"
97340266059SGregory Neil ShapiroR$+ <@>			$#error $@ 5.1.3 $: "_CODE553 Hostname required"
974c2aa98e2SPeter WemmR$*			$: <> $1
97540266059SGregory Neil Shapirodnl allow tricks like [host1]:[host2]
97640266059SGregory Neil ShapiroR<> $* < @ [ $* ] : $+ > $*	$1 < @ [ $2 ] : $3 > $4
97740266059SGregory Neil ShapiroR<> $* < @ [ $* ] , $+ > $*	$1 < @ [ $2 ] , $3 > $4
97840266059SGregory Neil Shapirodnl but no a@[b]c
97940266059SGregory Neil ShapiroR<> $* < @ [ $* ] $+ > $*	$#error $@ 5.1.2 $: "_CODE553 Invalid address"
980c2aa98e2SPeter WemmR<> $* < @ [ $+ ] > $*		$1 < @ [ $2 ] > $3
98140266059SGregory Neil ShapiroR<> $* <$* : $* > $*	$#error $@ 5.1.3 $: "_CODE553 Colon illegal in host name part"
982c2aa98e2SPeter WemmR<> $*			$1
98340266059SGregory Neil ShapiroR$* < @ . $* > $*	$#error $@ 5.1.2 $: "_CODE553 Invalid host name"
98440266059SGregory Neil ShapiroR$* < @ $* .. $* > $*	$#error $@ 5.1.2 $: "_CODE553 Invalid host name"
98540266059SGregory Neil Shapirodnl no a@b@
98640266059SGregory Neil ShapiroR$* < @ $* @ > $*	$#error $@ 5.1.2 $: "_CODE553 Invalid route address"
98740266059SGregory Neil Shapirodnl no a@b@c
98840266059SGregory Neil ShapiroR$* @ $* < @ $* > $*	$#error $@ 5.1.3 $: "_CODE553 Invalid route address"
98906f25ae9SGregory Neil Shapirodnl comma only allowed before @; this check is not complete
99040266059SGregory Neil ShapiroR$* , $~O $*		$#error $@ 5.1.3 $: "_CODE553 Invalid route address"
99140266059SGregory Neil Shapiro
99240266059SGregory Neil Shapiroifdef(`_STRICT_RFC821_', `# more RFC 821 checks
99340266059SGregory Neil ShapiroR$* . < @ $* > $*	$#error $@ 5.1.2 $: "_CODE553 Local part must not end with a dot"
99440266059SGregory Neil ShapiroR. $* < @ $* > $*	$#error $@ 5.1.2 $: "_CODE553 Local part must not begin with a dot"
99540266059SGregory Neil Shapirodnl', `dnl')
996c2aa98e2SPeter Wemm
997c2aa98e2SPeter Wemm# now delete the local info -- note $=O to find characters that cause forwarding
99806f25ae9SGregory Neil ShapiroR$* < @ > $*		$@ $>Parse0 $>canonify $1	user@ => user
99906f25ae9SGregory Neil ShapiroR< @ $=w . > : $*	$@ $>Parse0 $>canonify $2	@here:... -> ...
1000c2aa98e2SPeter WemmR$- < @ $=w . >		$: $(dequote $1 $) < @ $2 . >	dequote "foo"@here
100140266059SGregory Neil ShapiroR< @ $+ >		$#error $@ 5.1.3 $: "_CODE553 User address required"
100206f25ae9SGregory Neil ShapiroR$* $=O $* < @ $=w . >	$@ $>Parse0 $>canonify $1 $2 $3	...@here -> ...
1003c2aa98e2SPeter WemmR$- 			$: $(dequote $1 $) < @ *LOCAL* >	dequote "foo"
100440266059SGregory Neil ShapiroR< @ *LOCAL* >		$#error $@ 5.1.3 $: "_CODE553 User address required"
1005c2aa98e2SPeter WemmR$* $=O $* < @ *LOCAL* >
100606f25ae9SGregory Neil Shapiro			$@ $>Parse0 $>canonify $1 $2 $3	...@*LOCAL* -> ...
1007c2aa98e2SPeter WemmR$* < @ *LOCAL* >	$: $1
1008c2aa98e2SPeter Wemm
1009c2aa98e2SPeter Wemm#
1010c2aa98e2SPeter Wemm#  Parse1 -- the bottom half of ruleset 0.
1011c2aa98e2SPeter Wemm#
1012c2aa98e2SPeter Wemm
1013c2aa98e2SPeter WemmSParse1
101406f25ae9SGregory Neil Shapiroifdef(`_LDAP_ROUTING_', `dnl
101506f25ae9SGregory Neil Shapiro# handle LDAP routing for hosts in $={LDAPRoute}
101640266059SGregory Neil ShapiroR$+ < @ $={LDAPRoute} . >	$: $>LDAPExpand <$1 < @ $2 . >> <$1 @ $2> <>
101740266059SGregory Neil ShapiroR$+ < @ $={LDAPRouteEquiv} . >	$: $>LDAPExpand <$1 < @ $2 . >> <$1 @ $M> <>',
1018c2aa98e2SPeter Wemm`dnl')
1019c2aa98e2SPeter Wemm
102006f25ae9SGregory Neil Shapiroifdef(`_MAILER_smtp_',
102106f25ae9SGregory Neil Shapiro`# handle numeric address spec
102206f25ae9SGregory Neil Shapirodnl there is no check whether this is really an IP number
102306f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] > $*	$: $>ParseLocal $1 < @ [ $2 ] > $3	numeric internet spec
10245ef517c0SGregory Neil ShapiroR$* < @ [ $+ ] > $*	$: $1 < @ [ $2 ] : $S > $3	Add smart host to path
102506f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] : > $*		$#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3	no smarthost: send
102606f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] : $- : $*> $*	$#$3 $@ $4 $: $1 < @ [$2] > $5	smarthost with mailer
102706f25ae9SGregory Neil ShapiroR$* < @ [ $+ ] : $+ > $*	$#_SMTP_ $@ $3 $: $1 < @ [$2] > $4	smarthost without mailer',
102806f25ae9SGregory Neil Shapiro	`dnl')
102906f25ae9SGregory Neil Shapiro
103006f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_TABLE_', `dnl
1031c2aa98e2SPeter Wemm# handle virtual users
103240266059SGregory Neil Shapiroifdef(`_VIRTUSER_STOP_ONE_LEVEL_RECURSION_',`dnl
103340266059SGregory Neil Shapirodnl this is not a documented option
103440266059SGregory Neil Shapirodnl it stops looping in virtusertable mapping if input and output
103540266059SGregory Neil Shapirodnl are identical, i.e., if address A is mapped to A.
103640266059SGregory Neil Shapirodnl it does not deal with multi-level recursion
103740266059SGregory Neil Shapiro# handle full domains in RHS of virtusertable
103840266059SGregory Neil ShapiroR$+ < @ $+ >			$: $(macro {RecipientAddress} $) $1 < @ $2 >
103940266059SGregory Neil ShapiroR$+ < @ $+ > 			$: <?> $1 < @ $2 > $| $>final $1 < @ $2 >
104040266059SGregory Neil ShapiroR<?> $+ $| $+			$: $1 $(macro {RecipientAddress} $@ $2 $)
104140266059SGregory Neil ShapiroR<?> $+ $| $*			$: $1',
104240266059SGregory Neil Shapiro`dnl')
104306f25ae9SGregory Neil ShapiroR$+			$: <!> $1		Mark for lookup
104440266059SGregory Neil Shapirodnl input: <!> local<@domain>
104506f25ae9SGregory Neil Shapiroifdef(`_VIRTUSER_ENTIRE_DOMAIN_',
104606f25ae9SGregory Neil Shapiro`R<!> $+ < @ $* $={VirtHost} . > 	$: < $(virtuser $1 @ $2 $3 $@ $1 $: @ $) > $1 < @ $2 $3 . >',
104706f25ae9SGregory Neil Shapiro`R<!> $+ < @ $={VirtHost} . > 	$: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . >')
104840266059SGregory Neil Shapirodnl input: <result-of-lookup | @> local<@domain> | <!> local<@domain>
104906f25ae9SGregory Neil ShapiroR<!> $+ < @ $=w . > 	$: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . >
105040266059SGregory Neil Shapirodnl if <@> local<@domain>: no match but try lookup
105140266059SGregory Neil Shapirodnl user+detail: try user++@domain if detail not empty
105240266059SGregory Neil ShapiroR<@> $+ + $+ < @ $* . >
105340266059SGregory Neil Shapiro			$: < $(virtuser $1 + + @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . >
105440266059SGregory Neil Shapirodnl user+detail: try user+*@domain
1055c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . >
105640266059SGregory Neil Shapiro			$: < $(virtuser $1 + * @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . >
105740266059SGregory Neil Shapirodnl user+detail: try user@domain
1058c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . >
105940266059SGregory Neil Shapiro			$: < $(virtuser $1 @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . >
106006f25ae9SGregory Neil Shapirodnl try default entry: @domain
106140266059SGregory Neil Shapirodnl ++@domain
106240266059SGregory Neil ShapiroR<@> $+ + $+ < @ $+ . >	$: < $(virtuser + + @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . >
106306f25ae9SGregory Neil Shapirodnl +*@domain
106440266059SGregory Neil ShapiroR<@> $+ + $* < @ $+ . >	$: < $(virtuser + * @ $3 $@ $1 $@ $2 $@ +$2 $: @ $) > $1 + $2 < @ $3 . >
106506f25ae9SGregory Neil Shapirodnl @domain if +detail exists
106694c01205SGregory Neil Shapirodnl if no match, change marker to prevent a second @domain lookup
106794c01205SGregory Neil ShapiroR<@> $+ + $* < @ $+ . >	$: < $(virtuser @ $3 $@ $1 $@ $2 $@ +$2 $: ! $) > $1 + $2 < @ $3 . >
106894c01205SGregory Neil Shapirodnl without +detail
1069c2aa98e2SPeter WemmR<@> $+ < @ $+ . >	$: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . >
107040266059SGregory Neil Shapirodnl no match
1071c2aa98e2SPeter WemmR<@> $+			$: $1
107240266059SGregory Neil Shapirodnl remove mark
107306f25ae9SGregory Neil ShapiroR<!> $+			$: $1
107406f25ae9SGregory Neil ShapiroR< error : $-.$-.$- : $+ > $* 	$#error $@ $1.$2.$3 $: $4
1075c2aa98e2SPeter WemmR< error : $- $+ > $* 	$#error $@ $(dequote $1 $) $: $2
107640266059SGregory Neil Shapiroifdef(`_VIRTUSER_STOP_ONE_LEVEL_RECURSION_',`dnl
107740266059SGregory Neil Shapiro# check virtuser input address against output address, if same, skip recursion
107840266059SGregory Neil ShapiroR< $+ > $+ < @ $+ >				$: < $1 > $2 < @ $3 > $| $1
107940266059SGregory Neil Shapiro# it is the same: stop now
108040266059SGregory Neil ShapiroR< $+ > $+ < @ $+ > $| $&{RecipientAddress}	$: $>ParseLocal $>Parse0 $>canonify $1
108140266059SGregory Neil ShapiroR< $+ > $+ < @ $+ > $| $* 			$: < $1 > $2 < @ $3 >
108240266059SGregory Neil Shapirodnl', `dnl')
108313058a91SGregory Neil Shapirodnl this is not a documented option
108413058a91SGregory Neil Shapirodnl it performs no looping at all for virtusertable
10858774250cSGregory Neil Shapiroifdef(`_NO_VIRTUSER_RECURSION_',
10868774250cSGregory Neil Shapiro`R< $+ > $+ < @ $+ >	$: $>ParseLocal $>Parse0 $>canonify $1',
10878774250cSGregory Neil Shapiro`R< $+ > $+ < @ $+ >	$: $>Recurse $1')
10888774250cSGregory Neil Shapirodnl', `dnl')
1089c2aa98e2SPeter Wemm
1090c2aa98e2SPeter Wemm# short circuit local delivery so forwarded email works
1091c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', `dnl
109206f25ae9SGregory Neil ShapiroR$+ . USENET < @ $=w . >	$#usenet $@ usenet $: $1	handle usenet specially', `dnl')
109342e5d165SGregory Neil Shapiro
109442e5d165SGregory Neil Shapiro
1095c2aa98e2SPeter Wemmifdef(`_STICKY_LOCAL_DOMAIN_',
1096c2aa98e2SPeter Wemm`R$+ < @ $=w . >		$: < $H > $1 < @ $2 . >		first try hub
109706f25ae9SGregory Neil ShapiroR< $+ > $+ < $+ >	$>MailerToTriple < $1 > $2 < $3 >	yep ....
109806f25ae9SGregory Neil Shapirodnl $H empty (but @$=w.)
1099c2aa98e2SPeter WemmR< > $+ + $* < $+ >	$#_LOCAL_ $: $1 + $2		plussed name?
1100c2aa98e2SPeter WemmR< > $+ < $+ >		$#_LOCAL_ $: @ $1			nope, local address',
1101c2aa98e2SPeter Wemm`R$=L < @ $=w . >	$#_LOCAL_ $: @ $1			special local names
1102c2aa98e2SPeter WemmR$+ < @ $=w . >		$#_LOCAL_ $: $1			regular local name')
1103c2aa98e2SPeter Wemm
110406f25ae9SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl
1105c2aa98e2SPeter Wemm# not local -- try mailer table lookup
1106c2aa98e2SPeter WemmR$* <@ $+ > $*		$: < $2 > $1 < @ $2 > $3	extract host name
1107c2aa98e2SPeter WemmR< $+ . > $*		$: < $1 > $2			strip trailing dot
1108c2aa98e2SPeter WemmR< $+ > $*		$: < $(mailertable $1 $) > $2	lookup
110906f25ae9SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses
111006f25ae9SGregory Neil ShapiroR< $~[ : $* > $* 	$>MailerToTriple < $1 : $2 > $3		check -- resolved?
111106f25ae9SGregory Neil ShapiroR< $+ > $*		$: $>Mailertable <$1> $2		try domain',
1112c2aa98e2SPeter Wemm`dnl')
111306f25ae9SGregory Neil Shapiroundivert(4)dnl UUCP rules from `MAILER(uucp)'
1114c2aa98e2SPeter Wemm
1115c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl',
1116c2aa98e2SPeter Wemm`# resolve remotely connected UUCP links (if any)
1117c2aa98e2SPeter Wemmifdef(`_CLASS_V_',
111806f25ae9SGregory Neil Shapiro`R$* < @ $=V . UUCP . > $*		$: $>MailerToTriple < $V > $1 <@$2.UUCP.> $3',
1119c2aa98e2SPeter Wemm	`dnl')
1120c2aa98e2SPeter Wemmifdef(`_CLASS_W_',
112106f25ae9SGregory Neil Shapiro`R$* < @ $=W . UUCP . > $*		$: $>MailerToTriple < $W > $1 <@$2.UUCP.> $3',
1122c2aa98e2SPeter Wemm	`dnl')
1123c2aa98e2SPeter Wemmifdef(`_CLASS_X_',
112406f25ae9SGregory Neil Shapiro`R$* < @ $=X . UUCP . > $*		$: $>MailerToTriple < $X > $1 <@$2.UUCP.> $3',
1125c2aa98e2SPeter Wemm	`dnl')')
1126c2aa98e2SPeter Wemm
1127c2aa98e2SPeter Wemm# resolve fake top level domains by forwarding to other hosts
1128c2aa98e2SPeter Wemmifdef(`BITNET_RELAY',
112906f25ae9SGregory Neil Shapiro`R$*<@$+.BITNET.>$*	$: $>MailerToTriple < $B > $1 <@$2.BITNET.> $3	user@host.BITNET',
1130c2aa98e2SPeter Wemm	`dnl')
1131c2aa98e2SPeter Wemmifdef(`DECNET_RELAY',
113206f25ae9SGregory Neil Shapiro`R$*<@$+.DECNET.>$*	$: $>MailerToTriple < $C > $1 <@$2.DECNET.> $3	user@host.DECNET',
1133c2aa98e2SPeter Wemm	`dnl')
1134c2aa98e2SPeter Wemmifdef(`_MAILER_pop_',
1135c2aa98e2SPeter Wemm`R$+ < @ POP. >		$#pop $: $1			user@POP',
1136c2aa98e2SPeter Wemm	`dnl')
1137c2aa98e2SPeter Wemmifdef(`_MAILER_fax_',
1138c2aa98e2SPeter Wemm`R$+ < @ $+ .FAX. >	$#fax $@ $2 $: $1		user@host.FAX',
1139c2aa98e2SPeter Wemm`ifdef(`FAX_RELAY',
114006f25ae9SGregory Neil Shapiro`R$*<@$+.FAX.>$*		$: $>MailerToTriple < $F > $1 <@$2.FAX.> $3	user@host.FAX',
1141c2aa98e2SPeter Wemm	`dnl')')
1142c2aa98e2SPeter Wemm
1143c2aa98e2SPeter Wemmifdef(`UUCP_RELAY',
1144c2aa98e2SPeter Wemm`# forward non-local UUCP traffic to our UUCP relay
114506f25ae9SGregory Neil ShapiroR$*<@$*.UUCP.>$*		$: $>MailerToTriple < $Y > $1 <@$2.UUCP.> $3	uucp mail',
1146c2aa98e2SPeter Wemm`ifdef(`_MAILER_uucp_',
1147c2aa98e2SPeter Wemm`# forward other UUCP traffic straight to UUCP
1148c2aa98e2SPeter WemmR$* < @ $+ .UUCP. > $*		$#_UUCP_ $@ $2 $: $1 < @ $2 .UUCP. > $3	user@host.UUCP',
1149c2aa98e2SPeter Wemm	`dnl')')
1150c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', `
1151c2aa98e2SPeter Wemm# addresses sent to net.group.USENET will get forwarded to a newsgroup
115206f25ae9SGregory Neil ShapiroR$+ . USENET		$#usenet $@ usenet $: $1',
1153c2aa98e2SPeter Wemm	`dnl')
1154c2aa98e2SPeter Wemm
1155c2aa98e2SPeter Wemmifdef(`_LOCAL_RULES_',
1156c2aa98e2SPeter Wemm`# figure out what should stay in our local mail system
1157c2aa98e2SPeter Wemmundivert(1)', `dnl')
1158c2aa98e2SPeter Wemm
1159c2aa98e2SPeter Wemm# pass names that still have a host to a smarthost (if defined)
116006f25ae9SGregory Neil ShapiroR$* < @ $* > $*		$: $>MailerToTriple < $S > $1 < @ $2 > $3	glue on smarthost name
1161c2aa98e2SPeter Wemm
1162c2aa98e2SPeter Wemm# deal with other remote names
1163c2aa98e2SPeter Wemmifdef(`_MAILER_smtp_',
1164c2aa98e2SPeter Wemm`R$* < @$* > $*		$#_SMTP_ $@ $2 $: $1 < @ $2 > $3	user@host.domain',
116540266059SGregory Neil Shapiro`R$* < @$* > $*		$#error $@ 5.1.2 $: "_CODE553 Unrecognized host name " $2')
1166c2aa98e2SPeter Wemm
1167c2aa98e2SPeter Wemm# handle locally delivered names
1168c2aa98e2SPeter WemmR$=L			$#_LOCAL_ $: @ $1		special local names
1169c2aa98e2SPeter WemmR$+			$#_LOCAL_ $: $1			regular local names
1170c2aa98e2SPeter Wemm
1171c2aa98e2SPeter Wemm###########################################################################
1172c2aa98e2SPeter Wemm###   Ruleset 5 -- special rewriting after aliases have been expanded   ###
1173c2aa98e2SPeter Wemm###########################################################################
1174c2aa98e2SPeter Wemm
117506f25ae9SGregory Neil ShapiroSLocal_localaddr
117606f25ae9SGregory Neil ShapiroSlocaladdr=5
117706f25ae9SGregory Neil ShapiroR$+			$: $1 $| $>"Local_localaddr" $1
117840266059SGregory Neil ShapiroR$+ $| $#ok		$@ $1			no change
117906f25ae9SGregory Neil ShapiroR$+ $| $#$*		$#$2
118006f25ae9SGregory Neil ShapiroR$+ $| $*		$: $1
1181c2aa98e2SPeter Wemm
118240266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl
118340266059SGregory Neil Shapiro# Preserve rcpt_host in {Host}
118440266059SGregory Neil ShapiroR$+			$: $1 $| $&h $| $&{Host}	check h and {Host}
118540266059SGregory Neil ShapiroR$+ $| $|		$: $(macro {Host} $@ $) $1	no h or {Host}
118640266059SGregory Neil ShapiroR$+ $| $| $+		$: $1			h not set, {Host} set
118740266059SGregory Neil ShapiroR$+ $| +$* $| $*	$: $1			h is +detail, {Host} set
11886a2f2ff3SGregory Neil ShapiroR$+ $| $* @ $+ $| $*	$: $(macro {Host} $@ @$3 $) $1	set {Host} to host in h
118940266059SGregory Neil ShapiroR$+ $| $+ $| $*		$: $(macro {Host} $@ @$2 $) $1	set {Host} to h
119040266059SGregory Neil Shapiro')dnl
119140266059SGregory Neil Shapiro
119240266059SGregory Neil Shapiroifdef(`_FFR_5_', `dnl
119342e5d165SGregory Neil Shapiro# Preserve host in a macro
119442e5d165SGregory Neil ShapiroR$+			$: $(macro {LocalAddrHost} $) $1
119542e5d165SGregory Neil ShapiroR$+ @ $+		$: $(macro {LocalAddrHost} $@ @ $2 $) $1')
1196c2aa98e2SPeter Wemm
119740266059SGregory Neil Shapiroifdef(`_PRESERVE_LOCAL_PLUS_DETAIL_', `', `dnl
119842e5d165SGregory Neil Shapiro# deal with plussed users so aliases work nicely
119942e5d165SGregory Neil ShapiroR$+ + *			$#_LOCAL_ $@ $&h $: $1`'ifdef(`_FFR_5_', ` $&{LocalAddrHost}')
120042e5d165SGregory Neil ShapiroR$+ + $*		$#_LOCAL_ $@ + $2 $: $1 + *`'ifdef(`_FFR_5_', ` $&{LocalAddrHost}')
120142e5d165SGregory Neil Shapiro')
1202c2aa98e2SPeter Wemm# prepend an empty "forward host" on the front
1203c2aa98e2SPeter WemmR$+			$: <> $1
1204c2aa98e2SPeter Wemm
1205c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl
1206c2aa98e2SPeter Wemm# send unrecognized local users to a relay host
120740266059SGregory Neil Shapiroifdef(`_PRESERVE_LOCAL_PLUS_DETAIL_', `dnl
120842e5d165SGregory Neil ShapiroR< > $+ + $*		$: < ? $L > <+ $2> $(user $1 $)	look up user+
120942e5d165SGregory Neil ShapiroR< > $+			$: < ? $L > < > $(user $1 $)	look up user
121042e5d165SGregory Neil ShapiroR< ? $* > < $* > $+ <>	$: < > $3 $2			found; strip $L
121142e5d165SGregory Neil ShapiroR< ? $* > < $* > $+	$: < $1 > $3 $2			not found', `
121206f25ae9SGregory Neil ShapiroR< > $+ 		$: < $L > $(user $1 $)		look up user
121340266059SGregory Neil ShapiroR< $* > $+ <>		$: < > $2			found; strip $L')
121440266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl
121540266059SGregory Neil ShapiroR< $+ > $+		$: < $1 > $2 $&{Host}')
121640266059SGregory Neil Shapirodnl')
1217c2aa98e2SPeter Wemm
121840266059SGregory Neil Shapiroifdef(`MAIL_HUB', `dnl
121940266059SGregory Neil ShapiroR< > $+			$: < $H > $1			try hub', `dnl')
122040266059SGregory Neil Shapiroifdef(`LOCAL_RELAY', `dnl
122140266059SGregory Neil ShapiroR< > $+			$: < $R > $1			try relay', `dnl')
122240266059SGregory Neil Shapiroifdef(`_PRESERVE_LOCAL_PLUS_DETAIL_', `dnl
122340266059SGregory Neil ShapiroR< > $+			$@ $1', `dnl
122406f25ae9SGregory Neil ShapiroR< > $+			$: < > < $1 <> $&h >		nope, restore +detail
122540266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl
122640266059SGregory Neil ShapiroR< > < $+ @ $+ <> + $* >	$: < > < $1 + $3 @ $2 >	check whether +detail')
122706f25ae9SGregory Neil ShapiroR< > < $+ <> + $* >	$: < > < $1 + $2 >		check whether +detail
122806f25ae9SGregory Neil ShapiroR< > < $+ <> $* >	$: < > < $1 >			else discard
1229c2aa98e2SPeter WemmR< > < $+ + $* > $*	   < > < $1 > + $2 $3		find the user part
123042e5d165SGregory Neil ShapiroR< > < $+ > + $*	$#_LOCAL_ $@ $2 $: @ $1`'ifdef(`_FFR_5_', ` $&{LocalAddrHost}')		strip the extra +
1231c2aa98e2SPeter WemmR< > < $+ >		$@ $1				no +detail
12322e43090eSPeter WemmR$+			$: $1 <> $&h			add +detail back in
123340266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl
123440266059SGregory Neil ShapiroR$+ @ $+ <> + $*	$: $1 + $3 @ $2			check whether +detail')
12352e43090eSPeter WemmR$+ <> + $*		$: $1 + $2			check whether +detail
123642e5d165SGregory Neil ShapiroR$+ <> $*		$: $1				else discard')
123706f25ae9SGregory Neil ShapiroR< local : $* > $*	$: $>MailerToTriple < local : $1 > $2	no host extension
123806f25ae9SGregory Neil ShapiroR< error : $* > $*	$: $>MailerToTriple < error : $1 > $2	no host extension
123940266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl
124040266059SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses
124140266059SGregory Neil ShapiroR< $~[ : $+ > $+ @ $+	$: $>MailerToTriple < $1 : $2 > $3 < @ $4 >')
124240266059SGregory Neil ShapiroR< $~[ : $+ > $+	$: $>MailerToTriple < $1 : $2 > $3 < @ $2 >
124340266059SGregory Neil Shapiroifdef(`_PRESERVE_LUSER_HOST_', `dnl
124440266059SGregory Neil ShapiroR< $+ > $+ @ $+		$@ $>MailerToTriple < $1 > $2 < @ $3 >')
124506f25ae9SGregory Neil ShapiroR< $+ > $+		$@ $>MailerToTriple < $1 > $2 < @ $1 >
1246c2aa98e2SPeter Wemm
124706f25ae9SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl
124840266059SGregory Neil Shapiroifdef(`_LDAP_ROUTING_', `dnl
124940266059SGregory Neil Shapiro###################################################################
125040266059SGregory Neil Shapiro###  Ruleset LDAPMailertable -- mailertable lookup for LDAP     ###
125140266059SGregory Neil Shapirodnl input: <Domain> FullAddress
125240266059SGregory Neil Shapiro###################################################################
125340266059SGregory Neil Shapiro
125440266059SGregory Neil ShapiroSLDAPMailertable
125540266059SGregory Neil ShapiroR< $+ > $*		$: < $(mailertable $1 $) > $2		lookup
125640266059SGregory Neil ShapiroR< $~[ : $* > $*	$>MailerToTriple < $1 : $2 > $3		check resolved?
125740266059SGregory Neil ShapiroR< $+ > $*		$: < $1 > $>Mailertable <$1> $2		try domain
125840266059SGregory Neil ShapiroR< $+ > $#$*		$#$2					found
125940266059SGregory Neil ShapiroR< $+ > $*		$#_RELAY_ $@ $1 $: $2			not found, direct relay',
126040266059SGregory Neil Shapiro`dnl')
126140266059SGregory Neil Shapiro
1262c2aa98e2SPeter Wemm###################################################################
1263c2aa98e2SPeter Wemm###  Ruleset 90 -- try domain part of mailertable entry 	###
126406f25ae9SGregory Neil Shapirodnl input: LeftPartOfDomain <RightPartOfDomain> FullAddress
1265c2aa98e2SPeter Wemm###################################################################
1266c2aa98e2SPeter Wemm
126706f25ae9SGregory Neil ShapiroSMailertable=90
126806f25ae9SGregory Neil Shapirodnl shift and check
126906f25ae9SGregory Neil Shapirodnl %2 is not documented in cf/README
1270c2aa98e2SPeter WemmR$* <$- . $+ > $*	$: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4
127106f25ae9SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses
127206f25ae9SGregory Neil ShapiroR$* <$~[ : $* > $*	$>MailerToTriple < $2 : $3 > $4		check -- resolved?
127306f25ae9SGregory Neil ShapiroR$* < . $+ > $* 	$@ $>Mailertable $1 . <$2> $3		no -- strip & try again
127406f25ae9SGregory Neil Shapirodnl is $2 always empty?
1275c2aa98e2SPeter WemmR$* < $* > $*		$: < $(mailertable . $@ $1$2 $) > $3	try "."
127606f25ae9SGregory Neil ShapiroR< $~[ : $* > $*	$>MailerToTriple < $1 : $2 > $3		"." found?
127706f25ae9SGregory Neil Shapirodnl return full address
1278c2aa98e2SPeter WemmR< $* > $*		$@ $2				no mailertable match',
1279c2aa98e2SPeter Wemm`dnl')
1280c2aa98e2SPeter Wemm
1281c2aa98e2SPeter Wemm###################################################################
1282c2aa98e2SPeter Wemm###  Ruleset 95 -- canonify mailer:[user@]host syntax to triple	###
128306f25ae9SGregory Neil Shapirodnl input: in general: <[mailer:]host> lp<@domain>rest
128406f25ae9SGregory Neil Shapirodnl	<> address				-> address
128506f25ae9SGregory Neil Shapirodnl	<error:d.s.n:text>			-> error
1286a7ec597cSGregory Neil Shapirodnl	<error:keyword:text>			-> error
128706f25ae9SGregory Neil Shapirodnl	<error:text>				-> error
128806f25ae9SGregory Neil Shapirodnl	<mailer:user@host> lp<@domain>rest	-> mailer host user
128906f25ae9SGregory Neil Shapirodnl	<mailer:host> address			-> mailer host address
129006f25ae9SGregory Neil Shapirodnl	<localdomain> address			-> address
129106f25ae9SGregory Neil Shapirodnl	<host> address				-> relay host address
1292c2aa98e2SPeter Wemm###################################################################
1293c2aa98e2SPeter Wemm
129406f25ae9SGregory Neil ShapiroSMailerToTriple=95
1295c2aa98e2SPeter WemmR< > $*				$@ $1			strip off null relay
129606f25ae9SGregory Neil ShapiroR< error : $-.$-.$- : $+ > $* 	$#error $@ $1.$2.$3 $: $4
1297a7ec597cSGregory Neil ShapiroR< error : $- : $+ > $*		$#error $@ $(dequote $1 $) $: $2
1298a7ec597cSGregory Neil ShapiroR< error : $+ > $*		$#error $: $1
1299c2aa98e2SPeter WemmR< local : $* > $*		$>CanonLocal < $1 > $2
130040266059SGregory Neil Shapirodnl it is $~[ instead of $- to avoid matches on IPv6 addresses
130140266059SGregory Neil ShapiroR< $~[ : $+ @ $+ > $*<$*>$*	$# $1 $@ $3 $: $2<@$3>	use literal user
130240266059SGregory Neil ShapiroR< $~[ : $+ > $*		$# $1 $@ $2 $: $3	try qualified mailer
1303c2aa98e2SPeter WemmR< $=w > $*			$@ $2			delete local host
1304c2aa98e2SPeter WemmR< $+ > $*			$#_RELAY_ $@ $1 $: $2	use unqualified mailer
1305c2aa98e2SPeter Wemm
1306c2aa98e2SPeter Wemm###################################################################
1307c2aa98e2SPeter Wemm###  Ruleset CanonLocal -- canonify local: syntax		###
130806f25ae9SGregory Neil Shapirodnl input: <user> address
130906f25ae9SGregory Neil Shapirodnl <x> <@host> : rest			-> Recurse rest
131006f25ae9SGregory Neil Shapirodnl <x> p1 $=O p2 <@host>		-> Recurse p1 $=O p2
131106f25ae9SGregory Neil Shapirodnl <> user <@host> rest		-> local user@host user
131206f25ae9SGregory Neil Shapirodnl <> user				-> local user user
131306f25ae9SGregory Neil Shapirodnl <user@host> lp <@domain> rest	-> <user> lp <@host> [cont]
131406f25ae9SGregory Neil Shapirodnl <user> lp <@host> rest		-> local lp@host user
131506f25ae9SGregory Neil Shapirodnl <user> lp				-> local lp user
1316c2aa98e2SPeter Wemm###################################################################
1317c2aa98e2SPeter Wemm
1318c2aa98e2SPeter WemmSCanonLocal
13192e43090eSPeter Wemm# strip local host from routed addresses
132006f25ae9SGregory Neil ShapiroR< $* > < @ $+ > : $+		$@ $>Recurse $3
132106f25ae9SGregory Neil ShapiroR< $* > $+ $=O $+ < @ $+ >	$@ $>Recurse $2 $3 $4
13222e43090eSPeter Wemm
1323c2aa98e2SPeter Wemm# strip trailing dot from any host name that may appear
1324c2aa98e2SPeter WemmR< $* > $* < @ $* . >		$: < $1 > $2 < @ $3 >
1325c2aa98e2SPeter Wemm
1326c2aa98e2SPeter Wemm# handle local: syntax -- use old user, either with or without host
1327c2aa98e2SPeter WemmR< > $* < @ $* > $*		$#_LOCAL_ $@ $1@$2 $: $1
1328c2aa98e2SPeter WemmR< > $+				$#_LOCAL_ $@ $1    $: $1
1329c2aa98e2SPeter Wemm
1330c2aa98e2SPeter Wemm# handle local:user@host syntax -- ignore host part
1331c2aa98e2SPeter WemmR< $+ @ $+ > $* < @ $* >	$: < $1 > $3 < @ $4 >
1332c2aa98e2SPeter Wemm
1333c2aa98e2SPeter Wemm# handle local:user syntax
1334c2aa98e2SPeter WemmR< $+ > $* <@ $* > $*		$#_LOCAL_ $@ $2@$3 $: $1
1335c2aa98e2SPeter WemmR< $+ > $* 			$#_LOCAL_ $@ $2    $: $1
1336c2aa98e2SPeter Wemm
1337c2aa98e2SPeter Wemm###################################################################
1338c2aa98e2SPeter Wemm###  Ruleset 93 -- convert header names to masqueraded form	###
1339c2aa98e2SPeter Wemm###################################################################
1340c2aa98e2SPeter Wemm
134106f25ae9SGregory Neil ShapiroSMasqHdr=93
1342c2aa98e2SPeter Wemm
134306f25ae9SGregory Neil Shapiroifdef(`_GENERICS_TABLE_', `dnl
1344c2aa98e2SPeter Wemm# handle generics database
1345c2aa98e2SPeter Wemmifdef(`_GENERICS_ENTIRE_DOMAIN_',
134606f25ae9SGregory Neil Shapirodnl if generics should be applied add a @ as mark
1347c2aa98e2SPeter Wemm`R$+ < @ $* $=G . >	$: < $1@$2$3 > $1 < @ $2$3 . > @	mark',
1348c2aa98e2SPeter Wemm`R$+ < @ $=G . >	$: < $1@$2 > $1 < @ $2 . > @	mark')
1349c2aa98e2SPeter WemmR$+ < @ *LOCAL* >	$: < $1@$j > $1 < @ *LOCAL* > @	mark
135006f25ae9SGregory Neil Shapirodnl workspace: either user<@domain> or <user@domain> user <@domain> @
135106f25ae9SGregory Neil Shapirodnl ignore the first case for now
135206f25ae9SGregory Neil Shapirodnl if it has the mark lookup full address
135340266059SGregory Neil Shapirodnl broken: %1 is full address not just detail
135406f25ae9SGregory Neil ShapiroR< $+ > $+ < $* > @	$: < $(generics $1 $: @ $1 $) > $2 < $3 >
135506f25ae9SGregory Neil Shapirodnl workspace: ... or <match|@user@domain> user <@domain>
135606f25ae9SGregory Neil Shapirodnl no match, try user+detail@domain
135706f25ae9SGregory Neil ShapiroR<@$+ + $* @ $+> $+ < @ $+ >
135806f25ae9SGregory Neil Shapiro		$: < $(generics $1+*@$3 $@ $2 $:@$1 + $2@$3 $) >  $4 < @ $5 >
135906f25ae9SGregory Neil ShapiroR<@$+ + $* @ $+> $+ < @ $+ >
136006f25ae9SGregory Neil Shapiro		$: < $(generics $1@$3 $: $) > $4 < @ $5 >
136106f25ae9SGregory Neil Shapirodnl no match, remove mark
136206f25ae9SGregory Neil ShapiroR<@$+ > $+ < @ $+ >	$: < > $2 < @ $3 >
136306f25ae9SGregory Neil Shapirodnl no match, try @domain for exceptions
136406f25ae9SGregory Neil ShapiroR< > $+ < @ $+ . >	$: < $(generics @$2 $@ $1 $: $) > $1 < @ $2 . >
136506f25ae9SGregory Neil Shapirodnl workspace: ... or <match> user <@domain>
136606f25ae9SGregory Neil Shapirodnl no match, try local part
1367c2aa98e2SPeter WemmR< > $+ < @ $+ > 	$: < $(generics $1 $: $) > $1 < @ $2 >
136806f25ae9SGregory Neil ShapiroR< > $+ + $* < @ $+ > 	$: < $(generics $1+* $@ $2 $: $) > $1 + $2 < @ $3 >
136906f25ae9SGregory Neil ShapiroR< > $+ + $* < @ $+ > 	$: < $(generics $1 $: $) > $1 + $2 < @ $3 >
137006f25ae9SGregory Neil ShapiroR< $* @ $* > $* < $* >	$@ $>canonify $1 @ $2		found qualified
137106f25ae9SGregory Neil ShapiroR< $+ > $* < $* >	$: $>canonify $1 @ *LOCAL*	found unqualified
1372c2aa98e2SPeter WemmR< > $*			$: $1				not found',
1373c2aa98e2SPeter Wemm`dnl')
1374c2aa98e2SPeter Wemm
137506f25ae9SGregory Neil Shapiro# do not masquerade anything in class N
137606f25ae9SGregory Neil ShapiroR$* < @ $* $=N . >	$@ $1 < @ $2 $3 . >
137706f25ae9SGregory Neil Shapiro
137840266059SGregory Neil Shapiroifdef(`MASQUERADE_NAME', `dnl
1379c2aa98e2SPeter Wemm# special case the users that should be exposed
1380c2aa98e2SPeter WemmR$=E < @ *LOCAL* >	$@ $1 < @ $j . >		leave exposed
1381c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_',
1382c2aa98e2SPeter Wemm`R$=E < @ $* $=M . >	$@ $1 < @ $2 $3 . >',
1383c2aa98e2SPeter Wemm`R$=E < @ $=M . >	$@ $1 < @ $2 . >')
1384c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl',
1385c2aa98e2SPeter Wemm`R$=E < @ $=w . >	$@ $1 < @ $2 . >')
1386c2aa98e2SPeter Wemm
1387c2aa98e2SPeter Wemm# handle domain-specific masquerading
1388c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_',
1389c2aa98e2SPeter Wemm`R$* < @ $* $=M . > $*	$: $1 < @ $2 $3 . @ $M > $4	convert masqueraded doms',
1390c2aa98e2SPeter Wemm`R$* < @ $=M . > $*	$: $1 < @ $2 . @ $M > $3	convert masqueraded doms')
1391c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl',
1392c2aa98e2SPeter Wemm`R$* < @ $=w . > $*	$: $1 < @ $2 . @ $M > $3')
1393c2aa98e2SPeter WemmR$* < @ *LOCAL* > $*	$: $1 < @ $j . @ $M > $2
1394c2aa98e2SPeter WemmR$* < @ $+ @ > $*	$: $1 < @ $2 > $3		$M is null
1395c2aa98e2SPeter WemmR$* < @ $+ @ $+ > $*	$: $1 < @ $3 . > $4		$M is not null
139640266059SGregory Neil Shapirodnl', `dnl no masquerading
139740266059SGregory Neil Shapirodnl just fix *LOCAL* leftovers
139840266059SGregory Neil ShapiroR$* < @ *LOCAL* >	$@ $1 < @ $j . >')
1399c2aa98e2SPeter Wemm
1400c2aa98e2SPeter Wemm###################################################################
1401c2aa98e2SPeter Wemm###  Ruleset 94 -- convert envelope names to masqueraded form	###
1402c2aa98e2SPeter Wemm###################################################################
1403c2aa98e2SPeter Wemm
140406f25ae9SGregory Neil ShapiroSMasqEnv=94
1405c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENVELOPE_',
140606f25ae9SGregory Neil Shapiro`R$+			$@ $>MasqHdr $1',
1407c2aa98e2SPeter Wemm`R$* < @ *LOCAL* > $*	$: $1 < @ $j . > $2')
1408c2aa98e2SPeter Wemm
1409c2aa98e2SPeter Wemm###################################################################
1410c2aa98e2SPeter Wemm###  Ruleset 98 -- local part of ruleset zero (can be null)	###
1411c2aa98e2SPeter Wemm###################################################################
1412c2aa98e2SPeter Wemm
141306f25ae9SGregory Neil ShapiroSParseLocal=98
141406f25ae9SGregory Neil Shapiroundivert(3)dnl LOCAL_RULE_0
1415c2aa98e2SPeter Wemm
141606f25ae9SGregory Neil Shapiroifdef(`_LDAP_ROUTING_', `dnl
141740266059SGregory Neil Shapiro######################################################################
141840266059SGregory Neil Shapiro###  LDAPExpand: Expand address using LDAP routing
141940266059SGregory Neil Shapiro###
142040266059SGregory Neil Shapiro###	Parameters:
142140266059SGregory Neil Shapiro###		<$1> -- parsed address (user < @ domain . >) (pass through)
142240266059SGregory Neil Shapiro###		<$2> -- RFC822 address (user @ domain) (used for lookup)
142340266059SGregory Neil Shapiro###		<$3> -- +detail information
142440266059SGregory Neil Shapiro###
142540266059SGregory Neil Shapiro###	Returns:
142640266059SGregory Neil Shapiro###		Mailer triplet ($#mailer $@ host $: address)
142740266059SGregory Neil Shapiro###		Parsed address (user < @ domain . >)
142840266059SGregory Neil Shapiro######################################################################
142940266059SGregory Neil Shapiro
143006f25ae9SGregory Neil ShapiroSLDAPExpand
143106f25ae9SGregory Neil Shapiro# do the LDAP lookups
143240266059SGregory Neil ShapiroR<$+><$+><$*>	$: <$(ldapmra $2 $: $)> <$(ldapmh $2 $: $)> <$1> <$2> <$3>
143306f25ae9SGregory Neil Shapiro
1434605302a5SGregory Neil Shapiro# look for temporary failures (return original address, MTA will queue up)
1435959366dcSGregory Neil ShapiroR<$* <TMPF>> <$*> <$+> <$+> <$*>	$@ $3
1436959366dcSGregory Neil ShapiroR<$*> <$* <TMPF>> <$+> <$+> <$*>	$@ $3
1437605302a5SGregory Neil Shapiro
143806f25ae9SGregory Neil Shapiro# if mailRoutingAddress and local or non-existant mailHost,
143906f25ae9SGregory Neil Shapiro# return the new mailRoutingAddress
144040266059SGregory Neil Shapiroifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl
144140266059SGregory Neil ShapiroR<$+@$+> <$=w> <$+> <$+> <$*>	$@ $>Parse0 $>canonify $1 $6 @ $2
144240266059SGregory Neil ShapiroR<$+@$+> <> <$+> <$+> <$*>	$@ $>Parse0 $>canonify $1 $5 @ $2')
144340266059SGregory Neil ShapiroR<$+> <$=w> <$+> <$+> <$*>	$@ $>Parse0 $>canonify $1
144440266059SGregory Neil ShapiroR<$+> <> <$+> <$+> <$*>		$@ $>Parse0 $>canonify $1
144506f25ae9SGregory Neil Shapiro
144694c01205SGregory Neil Shapiro
144706f25ae9SGregory Neil Shapiro# if mailRoutingAddress and non-local mailHost,
144806f25ae9SGregory Neil Shapiro# relay to mailHost with new mailRoutingAddress
144940266059SGregory Neil Shapiroifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl
145040266059SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl
145140266059SGregory Neil Shapiro# check mailertable for host, relay from there
145240266059SGregory Neil ShapiroR<$+@$+> <$+> <$+> <$+> <$*>	$>LDAPMailertable <$3> $>canonify $1 $6 @ $2',
145340266059SGregory Neil Shapiro`R<$+@$+> <$+> <$+> <$+> <$*>	$#_RELAY_ $@ $3 $: $>canonify $1 $6 @ $2')')
145440266059SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl
145540266059SGregory Neil Shapiro# check mailertable for host, relay from there
145640266059SGregory Neil ShapiroR<$+> <$+> <$+> <$+> <$*>	$>LDAPMailertable <$2> $>canonify $1',
145740266059SGregory Neil Shapiro`R<$+> <$+> <$+> <$+> <$*>	$#_RELAY_ $@ $2 $: $>canonify $1')
145806f25ae9SGregory Neil Shapiro
145906f25ae9SGregory Neil Shapiro# if no mailRoutingAddress and local mailHost,
146006f25ae9SGregory Neil Shapiro# return original address
146140266059SGregory Neil ShapiroR<> <$=w> <$+> <$+> <$*>	$@ $2
146206f25ae9SGregory Neil Shapiro
146394c01205SGregory Neil Shapiro
146406f25ae9SGregory Neil Shapiro# if no mailRoutingAddress and non-local mailHost,
146506f25ae9SGregory Neil Shapiro# relay to mailHost with original address
146640266059SGregory Neil Shapiroifdef(`_MAILER_TABLE_', `dnl
146740266059SGregory Neil Shapiro# check mailertable for host, relay from there
146840266059SGregory Neil ShapiroR<> <$+> <$+> <$+> <$*>		$>LDAPMailertable <$1> $2',
146940266059SGregory Neil Shapiro`R<> <$+> <$+> <$+> <$*>	$#_RELAY_ $@ $1 $: $2')
147006f25ae9SGregory Neil Shapiro
147140266059SGregory Neil Shapiroifdef(`_LDAP_ROUTE_DETAIL_',
147240266059SGregory Neil Shapiro`# if no mailRoutingAddress and no mailHost,
147340266059SGregory Neil Shapiro# try without +detail
147440266059SGregory Neil ShapiroR<> <> <$+> <$+ + $* @ $+> <>	$@ $>LDAPExpand <$1> <$2 @ $4> <+$3>')dnl
147540266059SGregory Neil Shapiro
147640266059SGregory Neil Shapiro# if still no mailRoutingAddress and no mailHost,
147706f25ae9SGregory Neil Shapiro# try @domain
147840266059SGregory Neil Shapiroifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl
147940266059SGregory Neil ShapiroR<> <> <$+> <$+ + $* @ $+> <>	$@ $>LDAPExpand <$1> <@ $4> <+$3>')
148040266059SGregory Neil ShapiroR<> <> <$+> <$+ @ $+> <$*>	$@ $>LDAPExpand <$1> <@ $3> <$4>
148106f25ae9SGregory Neil Shapiro
148206f25ae9SGregory Neil Shapiro# if no mailRoutingAddress and no mailHost and this was a domain attempt,
148306f25ae9SGregory Neil Shapiroifelse(_LDAP_ROUTING_, `_MUST_EXIST_', `dnl
148406f25ae9SGregory Neil Shapiro# user does not exist
148540266059SGregory Neil ShapiroR<> <> <$+> <@ $+> <$*>		$: <?> < $&{addr_type} > < $1 >
148640266059SGregory Neil Shapiro# only give error for envelope recipient
148740266059SGregory Neil ShapiroR<?> <e r> <$+>			$#error $@ nouser $: "550 User unknown"
148840266059SGregory Neil ShapiroR<?> <$*> <$+>			$@ $2',
148906f25ae9SGregory Neil Shapiro`dnl
149006f25ae9SGregory Neil Shapiro# return the original address
149140266059SGregory Neil ShapiroR<> <> <$+> <@ $+> <$*>		$@ $1')',
149206f25ae9SGregory Neil Shapiro`dnl')
149306f25ae9SGregory Neil Shapiro
149406f25ae9SGregory Neil Shapiroifelse(substr(confDELIVERY_MODE,0,1), `d', `errprint(`WARNING: Antispam rules not available in deferred delivery mode.
149506f25ae9SGregory Neil Shapiro')')
149640266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl', `divert(-1)')
1497c2aa98e2SPeter Wemm######################################################################
149840266059SGregory Neil Shapiro###  D: LookUpDomain -- search for domain in access database
1499c2aa98e2SPeter Wemm###
1500c2aa98e2SPeter Wemm###	Parameters:
1501c2aa98e2SPeter Wemm###		<$1> -- key (domain name)
1502c2aa98e2SPeter Wemm###		<$2> -- default (what to return if not found in db)
150306f25ae9SGregory Neil Shapirodnl			must not be empty
150440266059SGregory Neil Shapiro###		<$3> -- mark (must be <(!|+) single-token>)
150506f25ae9SGregory Neil Shapiro###			! does lookup only with tag
150606f25ae9SGregory Neil Shapiro###			+ does lookup with and without tag
150740266059SGregory Neil Shapiro###		<$4> -- passthru (additional data passed unchanged through)
150806f25ae9SGregory Neil Shapirodnl returns:		<default> <passthru>
150906f25ae9SGregory Neil Shapirodnl 			<result> <passthru>
1510c2aa98e2SPeter Wemm######################################################################
1511c2aa98e2SPeter Wemm
151240266059SGregory Neil ShapiroSD
151306f25ae9SGregory Neil Shapirodnl workspace <key> <default> <passthru> <mark>
151406f25ae9SGregory Neil Shapirodnl lookup with tag (in front, no delimiter here)
151540266059SGregory Neil Shapirodnl    2    3  4    5
151640266059SGregory Neil ShapiroR<$*> <$+> <$- $-> <$*>		$: < $(access $4`'_TAG_DELIM_`'$1 $: ? $) > <$1> <$2> <$3 $4> <$5>
151706f25ae9SGregory Neil Shapirodnl workspace <result-of-lookup|?> <key> <default> <passthru> <mark>
151806f25ae9SGregory Neil Shapirodnl lookup without tag?
151940266059SGregory Neil Shapirodnl   1    2      3    4
152040266059SGregory Neil ShapiroR<?> <$+> <$+> <+ $-> <$*>	$: < $(access $1 $: ? $) > <$1> <$2> <+ $3> <$4>
152140266059SGregory Neil Shapiroifdef(`_LOOKUPDOTDOMAIN_', `dnl omit first component: lookup .rest
152240266059SGregory Neil Shapirodnl XXX apply this also to IP addresses?
152340266059SGregory Neil Shapirodnl currently it works the wrong way round for [1.2.3.4]
152440266059SGregory Neil Shapirodnl   1  2    3    4  5    6
152540266059SGregory Neil ShapiroR<?> <$+.$+> <$+> <$- $-> <$*>	$: < $(access $5`'_TAG_DELIM_`'.$2 $: ? $) > <$1.$2> <$3> <$4 $5> <$6>
152640266059SGregory Neil Shapirodnl   1  2    3      4    5
152740266059SGregory Neil ShapiroR<?> <$+.$+> <$+> <+ $-> <$*>	$: < $(access .$2 $: ? $) > <$1.$2> <$3> <+ $4> <$5>', `dnl')
152840266059SGregory Neil Shapiroifdef(`_ACCESS_SKIP_', `dnl
152940266059SGregory Neil Shapirodnl found SKIP: return <default> and <passthru>
153040266059SGregory Neil Shapirodnl      1    2    3  4    5
153140266059SGregory Neil ShapiroR<SKIP> <$+> <$+> <$- $-> <$*>	$@ <$2> <$5>', `dnl')
153240266059SGregory Neil Shapirodnl not found: IPv4 net (no check is done whether it is an IP number!)
153340266059SGregory Neil Shapirodnl    1  2     3    4  5    6
153440266059SGregory Neil ShapiroR<?> <[$+.$-]> <$+> <$- $-> <$*>	$@ $>D <[$1]> <$3> <$4 $5> <$6>
153540266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl',
153640266059SGregory Neil Shapiro`dnl not found: IPv6 net
153740266059SGregory Neil Shapirodnl (could be merged with previous rule if we have a class containing .:)
153840266059SGregory Neil Shapirodnl    1   2     3    4  5    6
153940266059SGregory Neil ShapiroR<?> <[$+::$-]> <$+> <$- $-> <$*>	$: $>D <[$1]> <$3> <$4 $5> <$6>
154040266059SGregory Neil ShapiroR<?> <[$+:$-]> <$+> <$- $-> <$*>	$: $>D <[$1]> <$3> <$4 $5> <$6>')
154106f25ae9SGregory Neil Shapirodnl not found, but subdomain: try again
154240266059SGregory Neil Shapirodnl   1  2    3    4  5    6
154340266059SGregory Neil ShapiroR<?> <$+.$+> <$+> <$- $-> <$*>	$@ $>D <$2> <$3> <$4 $5> <$6>
154440266059SGregory Neil Shapiroifdef(`_FFR_LOOKUPTAG_', `dnl lookup Tag:
154540266059SGregory Neil Shapirodnl   1    2      3    4
154640266059SGregory Neil ShapiroR<?> <$+> <$+> <! $-> <$*>	$: < $(access $3`'_TAG_DELIM_ $: ? $) > <$1> <$2> <! $3> <$4>', `dnl')
154740266059SGregory Neil Shapirodnl not found, no subdomain: return <default> and <passthru>
154840266059SGregory Neil Shapirodnl   1    2    3  4    5
154940266059SGregory Neil ShapiroR<?> <$+> <$+> <$- $-> <$*>	$@ <$2> <$5>
155040266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
155140266059SGregory Neil Shapirodnl            2    3    4  5    6
155240266059SGregory Neil ShapiroR<$* _ATMPF_> <$+> <$+> <$- $-> <$*>	$@ <_ATMPF_> <$6>', `dnl')
155340266059SGregory Neil Shapirodnl return <result of lookup> and <passthru>
155440266059SGregory Neil Shapirodnl    2    3    4  5    6
155540266059SGregory Neil ShapiroR<$*> <$+> <$+> <$- $-> <$*>	$@ <$1> <$6>
1556c2aa98e2SPeter Wemm
1557c2aa98e2SPeter Wemm######################################################################
155840266059SGregory Neil Shapiro###  A: LookUpAddress -- search for host address in access database
1559c2aa98e2SPeter Wemm###
1560c2aa98e2SPeter Wemm###	Parameters:
1561c2aa98e2SPeter Wemm###		<$1> -- key (dot quadded host address)
1562c2aa98e2SPeter Wemm###		<$2> -- default (what to return if not found in db)
156306f25ae9SGregory Neil Shapirodnl			must not be empty
156440266059SGregory Neil Shapiro###		<$3> -- mark (must be <(!|+) single-token>)
156506f25ae9SGregory Neil Shapiro###			! does lookup only with tag
156606f25ae9SGregory Neil Shapiro###			+ does lookup with and without tag
156740266059SGregory Neil Shapiro###		<$4> -- passthru (additional data passed through)
156806f25ae9SGregory Neil Shapirodnl	returns:	<default> <passthru>
156906f25ae9SGregory Neil Shapirodnl			<result> <passthru>
1570c2aa98e2SPeter Wemm######################################################################
1571c2aa98e2SPeter Wemm
157240266059SGregory Neil ShapiroSA
157306f25ae9SGregory Neil Shapirodnl lookup with tag
157440266059SGregory Neil Shapirodnl    2    3  4    5
157540266059SGregory Neil ShapiroR<$+> <$+> <$- $-> <$*>		$: < $(access $4`'_TAG_DELIM_`'$1 $: ? $) > <$1> <$2> <$3 $4> <$5>
157606f25ae9SGregory Neil Shapirodnl lookup without tag
157740266059SGregory Neil Shapirodnl   1    2      3    4
157840266059SGregory Neil ShapiroR<?> <$+> <$+> <+ $-> <$*>	$: < $(access $1 $: ? $) > <$1> <$2> <+ $3> <$4>
157940266059SGregory Neil Shapirodnl workspace <result-of-lookup|?> <key> <default> <mark> <passthru>
158040266059SGregory Neil Shapiroifdef(`_ACCESS_SKIP_', `dnl
158140266059SGregory Neil Shapirodnl found SKIP: return <default> and <passthru>
158240266059SGregory Neil Shapirodnl      1    2    3  4    5
158340266059SGregory Neil ShapiroR<SKIP> <$+> <$+> <$- $-> <$*>	$@ <$2> <$5>', `dnl')
158440266059SGregory Neil Shapiroifdef(`NO_NETINET6', `dnl',
158540266059SGregory Neil Shapiro`dnl no match; IPv6: remove last part
158640266059SGregory Neil Shapirodnl   1   2    3    4  5    6
158740266059SGregory Neil ShapiroR<?> <$+::$-> <$+> <$- $-> <$*>		$@ $>A <$1> <$3> <$4 $5> <$6>
158840266059SGregory Neil ShapiroR<?> <$+:$-> <$+> <$- $-> <$*>		$@ $>A <$1> <$3> <$4 $5> <$6>')
158906f25ae9SGregory Neil Shapirodnl no match; IPv4: remove last part
159040266059SGregory Neil Shapirodnl   1  2    3    4  5    6
159140266059SGregory Neil ShapiroR<?> <$+.$-> <$+> <$- $-> <$*>		$@ $>A <$1> <$3> <$4 $5> <$6>
159206f25ae9SGregory Neil Shapirodnl no match: return default
159340266059SGregory Neil Shapirodnl   1    2    3  4    5
159440266059SGregory Neil ShapiroR<?> <$+> <$+> <$- $-> <$*>	$@ <$2> <$5>
159540266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
159640266059SGregory Neil Shapirodnl            2    3    4  5    6
159740266059SGregory Neil ShapiroR<$* _ATMPF_> <$+> <$+> <$- $-> <$*>	$@ <_ATMPF_> <$6>', `dnl')
159806f25ae9SGregory Neil Shapirodnl match: return result
159940266059SGregory Neil Shapirodnl    2    3    4  5    6
160040266059SGregory Neil ShapiroR<$*> <$+> <$+> <$- $-> <$*>	$@ <$1> <$6>
160140266059SGregory Neil Shapirodnl endif _ACCESS_TABLE_
160240266059SGregory Neil Shapirodivert(0)
1603c2aa98e2SPeter Wemm######################################################################
1604065a643dSPeter Wemm###  CanonAddr --	Convert an address into a standard form for
1605065a643dSPeter Wemm###			relay checking.  Route address syntax is
1606065a643dSPeter Wemm###			crudely converted into a %-hack address.
1607065a643dSPeter Wemm###
1608065a643dSPeter Wemm###	Parameters:
1609065a643dSPeter Wemm###		$1 -- full recipient address
1610065a643dSPeter Wemm###
1611065a643dSPeter Wemm###	Returns:
1612065a643dSPeter Wemm###		parsed address, not in source route form
161306f25ae9SGregory Neil Shapirodnl		user%host%host<@domain>
161406f25ae9SGregory Neil Shapirodnl		host!user<@domain>
1615065a643dSPeter Wemm######################################################################
1616065a643dSPeter Wemm
1617065a643dSPeter WemmSCanonAddr
161806f25ae9SGregory Neil ShapiroR$*			$: $>Parse0 $>canonify $1	make domain canonical
161906f25ae9SGregory Neil Shapiroifdef(`_USE_DEPRECATED_ROUTE_ADDR_',`dnl
1620065a643dSPeter WemmR< @ $+ > : $* @ $*	< @ $1 > : $2 % $3	change @ to % in src route
1621065a643dSPeter WemmR$* < @ $+ > : $* : $*	$3 $1 < @ $2 > : $4	change to % hack.
1622065a643dSPeter WemmR$* < @ $+ > : $*	$3 $1 < @ $2 >
162306f25ae9SGregory Neil Shapirodnl')
1624065a643dSPeter Wemm
1625065a643dSPeter Wemm######################################################################
1626c2aa98e2SPeter Wemm###  ParseRecipient --	Strip off hosts in $=R as well as possibly
1627c2aa98e2SPeter Wemm###			$* $=m or the access database.
1628c2aa98e2SPeter Wemm###			Check user portion for host separators.
1629c2aa98e2SPeter Wemm###
1630c2aa98e2SPeter Wemm###	Parameters:
1631c2aa98e2SPeter Wemm###		$1 -- full recipient address
1632c2aa98e2SPeter Wemm###
1633c2aa98e2SPeter Wemm###	Returns:
1634c2aa98e2SPeter Wemm###		parsed, non-local-relaying address
1635c2aa98e2SPeter Wemm######################################################################
1636c2aa98e2SPeter Wemm
1637c2aa98e2SPeter WemmSParseRecipient
163806f25ae9SGregory Neil Shapirodnl mark and canonify address
1639065a643dSPeter WemmR$*				$: <?> $>CanonAddr $1
164006f25ae9SGregory Neil Shapirodnl workspace: <?> localpart<@domain[.]>
1641c2aa98e2SPeter WemmR<?> $* < @ $* . >		<?> $1 < @ $2 >			strip trailing dots
164206f25ae9SGregory Neil Shapirodnl workspace: <?> localpart<@domain>
1643c2aa98e2SPeter WemmR<?> $- < @ $* >		$: <?> $(dequote $1 $) < @ $2 >	dequote local part
1644c2aa98e2SPeter Wemm
1645c2aa98e2SPeter Wemm# if no $=O character, no host in the user portion, we are done
1646c2aa98e2SPeter WemmR<?> $* $=O $* < @ $* >		$: <NO> $1 $2 $3 < @ $4>
164706f25ae9SGregory Neil Shapirodnl no $=O in localpart: return
1648c2aa98e2SPeter WemmR<?> $*				$@ $1
1649c2aa98e2SPeter Wemm
165040266059SGregory Neil Shapirodnl workspace: <NO> localpart<@domain>, where localpart contains $=O
165106f25ae9SGregory Neil Shapirodnl mark everything which has an "authorized" domain with <RELAY>
1652c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl
1653c2aa98e2SPeter Wemm# if we relay, check username portion for user%host so host can be checked also
1654c2aa98e2SPeter WemmR<NO> $* < @ $* $=m >		$: <RELAY> $1 < @ $2 $3 >', `dnl')
165506f25ae9SGregory Neil Shapirodnl workspace: <(NO|RELAY)> localpart<@domain>, where localpart contains $=O
165606f25ae9SGregory Neil Shapirodnl if mark is <NO> then change it to <RELAY> if domain is "authorized"
165740266059SGregory Neil Shapiro
165840266059SGregory Neil Shapirodnl what if access map returns something else than RELAY?
165940266059SGregory Neil Shapirodnl we are only interested in RELAY entries...
166040266059SGregory Neil Shapirodnl other To: entries: blacklist recipient; generic entries?
166140266059SGregory Neil Shapirodnl if it is an error we probably do not want to relay anyway
1662c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_',
1663c2aa98e2SPeter Wemm`R<NO> $* < @ $=R >		$: <RELAY> $1 < @ $2 >
166406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
166506f25ae9SGregory Neil ShapiroR<NO> $* < @ $+ >		$: <$(access To:$2 $: NO $)> $1 < @ $2 >
1666065a643dSPeter WemmR<NO> $* < @ $+ >		$: <$(access $2 $: NO $)> $1 < @ $2 >',`dnl')',
1667c2aa98e2SPeter Wemm`R<NO> $* < @ $* $=R >		$: <RELAY> $1 < @ $2 $3 >
166806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
166940266059SGregory Neil ShapiroR<NO> $* < @ $+ >		$: $>D <$2> <NO> <+ To> <$1 < @ $2 >>
1670c2aa98e2SPeter WemmR<$+> <$+>			$: <$1> $2',`dnl')')
1671065a643dSPeter Wemm
167206f25ae9SGregory Neil Shapiro
167340266059SGregory Neil Shapiroifdef(`_RELAY_MX_SERVED_', `dnl
167440266059SGregory Neil Shapirodnl do "we" ($=w) act as backup MX server for the destination domain?
167540266059SGregory Neil ShapiroR<NO> $* < @ $+ >		$: <MX> < : $(mxserved $2 $) : > < $1 < @$2 > >
167640266059SGregory Neil ShapiroR<MX> < : $* <TEMP> : > $*	$#TEMP $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1
167740266059SGregory Neil Shapirodnl yes: mark it as <RELAY>
167840266059SGregory Neil ShapiroR<MX> < $* : $=w. : $* > < $+ >	$: <RELAY> $4
167940266059SGregory Neil Shapirodnl no: put old <NO> mark back
168040266059SGregory Neil ShapiroR<MX> < : $* : > < $+ >		$: <NO> $2', `dnl')
168140266059SGregory Neil Shapiro
168240266059SGregory Neil Shapirodnl do we relay to this recipient domain?
1683c2aa98e2SPeter WemmR<RELAY> $* < @ $* >		$@ $>ParseRecipient $1
168440266059SGregory Neil Shapirodnl something else
168540266059SGregory Neil ShapiroR<$+> $*			$@ $2
1686c2aa98e2SPeter Wemm
168706f25ae9SGregory Neil Shapiro
1688c2aa98e2SPeter Wemm######################################################################
1689c2aa98e2SPeter Wemm###  check_relay -- check hostname/address on SMTP startup
1690c2aa98e2SPeter Wemm######################################################################
1691c2aa98e2SPeter Wemm
1692c2aa98e2SPeter WemmSLocal_check_relay
169306f25ae9SGregory Neil ShapiroScheck`'_U_`'relay
1694c2aa98e2SPeter WemmR$*			$: $1 $| $>"Local_check_relay" $1
1695c2aa98e2SPeter WemmR$* $| $* $| $#$*	$#$3
1696c2aa98e2SPeter WemmR$* $| $* $| $*		$@ $>"Basic_check_relay" $1 $| $2
1697c2aa98e2SPeter Wemm
1698c2aa98e2SPeter WemmSBasic_check_relay
1699c2aa98e2SPeter Wemm# check for deferred delivery mode
170094c01205SGregory Neil ShapiroR$*			$: < $&{deliveryMode} > $1
1701c2aa98e2SPeter WemmR< d > $*		$@ deferred
1702c2aa98e2SPeter WemmR< $* > $*		$: $2
1703c2aa98e2SPeter Wemm
170406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
170542e5d165SGregory Neil Shapirodnl workspace: {client_name} $| {client_addr}
170640266059SGregory Neil ShapiroR$+ $| $+		$: $>D < $1 > <?> <+ Connect> < $2 >
170742e5d165SGregory Neil Shapirodnl workspace: <result-of-lookup> <{client_addr}>
170813bd1963SGregory Neil Shapirodnl OR $| $+ if client_name is empty
170913bd1963SGregory Neil ShapiroR   $| $+		$: $>A < $1 > <?> <+ Connect> <>	empty client_name
171013bd1963SGregory Neil Shapirodnl workspace: <result-of-lookup> <{client_addr}>
171140266059SGregory Neil ShapiroR<?> <$+>		$: $>A < $1 > <?> <+ Connect> <>	no: another lookup
171240266059SGregory Neil Shapirodnl workspace: <result-of-lookup> (<>|<{client_addr}>)
171340266059SGregory Neil ShapiroR<?> <$*>		$: OK				found nothing
171440266059SGregory Neil Shapirodnl workspace: <result-of-lookup> (<>|<{client_addr}>) | OK
171542e5d165SGregory Neil ShapiroR<$={Accept}> <$*>	$@ $1				return value of lookup
171640266059SGregory Neil ShapiroR<REJECT> <$*>		$#error ifdef(`confREJECT_MSG', `$: "confREJECT_MSG"', `$@ 5.7.1 $: "550 Access denied"')
171740266059SGregory Neil ShapiroR<DISCARD> <$*>		$#discard $: discard
171840266059SGregory Neil Shapiroifdef(`_FFR_QUARANTINE',
171940266059SGregory Neil Shapiro`R<QUARANTINE:$+> <$*>	$#error $@ quarantine $: $1', `dnl')
172006f25ae9SGregory Neil Shapirodnl error tag
172142e5d165SGregory Neil ShapiroR<ERROR:$-.$-.$-:$+> <$*>	$#error $@ $1.$2.$3 $: $4
172242e5d165SGregory Neil ShapiroR<ERROR:$+> <$*>		$#error $: $1
172340266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<$* _ATMPF_> <$*>		$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
172406f25ae9SGregory Neil Shapirodnl generic error from access map
172542e5d165SGregory Neil ShapiroR<$+> <$*>		$#error $: $1', `dnl')
1726c2aa98e2SPeter Wemm
1727c2aa98e2SPeter Wemmifdef(`_RBL_',`dnl
172806f25ae9SGregory Neil Shapiro# DNS based IP address spam list
172940266059SGregory Neil Shapirodnl workspace: ignored...
1730c2aa98e2SPeter WemmR$*			$: $&{client_addr}
173106f25ae9SGregory Neil ShapiroR$-.$-.$-.$-		$: <?> $(host $4.$3.$2.$1._RBL_. $: OK $)
173206f25ae9SGregory Neil ShapiroR<?>OK			$: OKSOFAR
173394c01205SGregory Neil ShapiroR<?>$+			$#error $@ 5.7.1 $: "550 Rejected: " $&{client_addr} " listed at _RBL_"',
1734c2aa98e2SPeter Wemm`dnl')
173506f25ae9SGregory Neil Shapiroundivert(8)
1736c2aa98e2SPeter Wemm
1737c2aa98e2SPeter Wemm######################################################################
1738c2aa98e2SPeter Wemm###  check_mail -- check SMTP ``MAIL FROM:'' command argument
1739c2aa98e2SPeter Wemm######################################################################
1740c2aa98e2SPeter Wemm
1741c2aa98e2SPeter WemmSLocal_check_mail
174206f25ae9SGregory Neil ShapiroScheck`'_U_`'mail
1743c2aa98e2SPeter WemmR$*			$: $1 $| $>"Local_check_mail" $1
1744c2aa98e2SPeter WemmR$* $| $#$*		$#$2
1745c2aa98e2SPeter WemmR$* $| $*		$@ $>"Basic_check_mail" $1
1746c2aa98e2SPeter Wemm
1747c2aa98e2SPeter WemmSBasic_check_mail
1748c2aa98e2SPeter Wemm# check for deferred delivery mode
174994c01205SGregory Neil ShapiroR$*			$: < $&{deliveryMode} > $1
1750c2aa98e2SPeter WemmR< d > $*		$@ deferred
1751c2aa98e2SPeter WemmR< $* > $*		$: $2
1752c2aa98e2SPeter Wemm
175306f25ae9SGregory Neil Shapiro# authenticated?
175406f25ae9SGregory Neil Shapirodnl done first: we can require authentication for every mail transaction
175506f25ae9SGregory Neil Shapirodnl workspace: address as given by MAIL FROM: (sender)
175606f25ae9SGregory Neil ShapiroR$*			$: $1 $| $>"tls_client" $&{verify} $| MAIL
175706f25ae9SGregory Neil ShapiroR$* $| $#$+		$#$2
175806f25ae9SGregory Neil Shapirodnl undo damage: remove result of tls_client call
175906f25ae9SGregory Neil ShapiroR$* $| $*		$: $1
176006f25ae9SGregory Neil Shapiro
176106f25ae9SGregory Neil Shapirodnl workspace: address as given by MAIL FROM:
176206f25ae9SGregory Neil ShapiroR<>			$@ <OK>			we MUST accept <> (RFC 1123)
176306f25ae9SGregory Neil Shapiroifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl
176406f25ae9SGregory Neil Shapirodnl do some additional checks
176506f25ae9SGregory Neil Shapirodnl no user@host
176606f25ae9SGregory Neil Shapirodnl no user@localhost (if nonlocal sender)
176706f25ae9SGregory Neil Shapirodnl this is a pretty simple canonification, it will not catch every case
176806f25ae9SGregory Neil Shapirodnl just make sure the address has <> around it (which is required by
176906f25ae9SGregory Neil Shapirodnl the RFC anyway, maybe we should complain if they are missing...)
177006f25ae9SGregory Neil Shapirodnl dirty trick: if it is user@host, just add a dot: user@host. this will
177106f25ae9SGregory Neil Shapirodnl not be modified by host lookups.
177206f25ae9SGregory Neil ShapiroR$+			$: <?> $1
177306f25ae9SGregory Neil ShapiroR<?><$+>		$: <@> <$1>
177406f25ae9SGregory Neil ShapiroR<?>$+			$: <@> <$1>
177506f25ae9SGregory Neil Shapirodnl workspace: <@> <address>
177606f25ae9SGregory Neil Shapirodnl prepend daemon_flags
177706f25ae9SGregory Neil ShapiroR$*			$: $&{daemon_flags} $| $1
177806f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <@> <address>
177906f25ae9SGregory Neil Shapirodnl do not allow these at all or only from local systems?
178006f25ae9SGregory Neil ShapiroR$* f $* $| <@> < $* @ $- >	$: < ? $&{client_name} > < $3 @ $4 >
178106f25ae9SGregory Neil Shapirodnl accept unqualified sender: change mark to avoid test
178206f25ae9SGregory Neil ShapiroR$* u $* $| <@> < $* >	$: <?> < $3 >
178306f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <@> <address>
178406f25ae9SGregory Neil Shapirodnl        or:                    <? ${client_name} > <address>
178506f25ae9SGregory Neil Shapirodnl        or:                    <?> <address>
178606f25ae9SGregory Neil Shapirodnl remove daemon_flags
178706f25ae9SGregory Neil ShapiroR$* $| $*		$: $2
178806f25ae9SGregory Neil Shapiro# handle case of @localhost on address
178906f25ae9SGregory Neil ShapiroR<@> < $* @ localhost >	$: < ? $&{client_name} > < $1 @ localhost >
179006f25ae9SGregory Neil ShapiroR<@> < $* @ [127.0.0.1] >
179106f25ae9SGregory Neil Shapiro			$: < ? $&{client_name} > < $1 @ [127.0.0.1] >
179206f25ae9SGregory Neil ShapiroR<@> < $* @ localhost.$m >
179306f25ae9SGregory Neil Shapiro			$: < ? $&{client_name} > < $1 @ localhost.$m >
179406f25ae9SGregory Neil Shapiroifdef(`_NO_UUCP_', `dnl',
179506f25ae9SGregory Neil Shapiro`R<@> < $* @ localhost.UUCP >
179606f25ae9SGregory Neil Shapiro			$: < ? $&{client_name} > < $1 @ localhost.UUCP >')
179706f25ae9SGregory Neil Shapirodnl workspace: < ? $&{client_name} > <user@localhost|host>
179806f25ae9SGregory Neil Shapirodnl	or:    <@> <address>
179906f25ae9SGregory Neil Shapirodnl	or:    <?> <address>	(thanks to u in ${daemon_flags})
180006f25ae9SGregory Neil ShapiroR<@> $*			$: $1			no localhost as domain
180106f25ae9SGregory Neil Shapirodnl workspace: < ? $&{client_name} > <user@localhost|host>
180206f25ae9SGregory Neil Shapirodnl	or:    <address>
180306f25ae9SGregory Neil Shapirodnl	or:    <?> <address>	(thanks to u in ${daemon_flags})
180406f25ae9SGregory Neil ShapiroR<? $=w> $*		$: $2			local client: ok
180540266059SGregory Neil ShapiroR<? $+> <$+>		$#error $@ 5.5.4 $: "_CODE553 Real domain name required for sender address"
180606f25ae9SGregory Neil Shapirodnl remove <?> (happens only if ${client_name} == "" or u in ${daemon_flags})
180706f25ae9SGregory Neil ShapiroR<?> $*			$: $1')
180806f25ae9SGregory Neil Shapirodnl workspace: address (or <address>)
180906f25ae9SGregory Neil ShapiroR$*			$: <?> $>CanonAddr $1		canonify sender address and mark it
181006f25ae9SGregory Neil Shapirodnl workspace: <?> CanonicalAddress (i.e. address in canonical form localpart<@host>)
181106f25ae9SGregory Neil Shapirodnl there is nothing behind the <@host> so no trailing $* needed
1812065a643dSPeter WemmR<?> $* < @ $+ . >	<?> $1 < @ $2 >			strip trailing dots
1813c2aa98e2SPeter Wemm# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc)
1814959366dcSGregory Neil ShapiroR<?> $* < @ $* $=P >	$: <_RES_OK_> $1 < @ $2 $3 >
181506f25ae9SGregory Neil Shapirodnl workspace <mark> CanonicalAddress	where mark is ? or OK
181694c01205SGregory Neil Shapirodnl A sender address with my local host name ($j) is safe
1817959366dcSGregory Neil ShapiroR<?> $* < @ $j >	$: <_RES_OK_> $1 < @ $j >
1818c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_',
181940266059SGregory Neil Shapiro`R<?> $* < @ $+ >	$: <_RES_OK_> $1 < @ $2 >		... unresolvable OK',
182006f25ae9SGregory Neil Shapiro`R<?> $* < @ $+ >	$: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 >
182106f25ae9SGregory Neil ShapiroR<? $* <$->> $* < @ $+ >
182206f25ae9SGregory Neil Shapiro			$: <$2> $3 < @ $4 >')
182340266059SGregory Neil Shapirodnl workspace <mark> CanonicalAddress	where mark is ?, _RES_OK_, PERM, TEMP
182406f25ae9SGregory Neil Shapirodnl mark is ? iff the address is user (wo @domain)
1825c2aa98e2SPeter Wemm
182606f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
182706f25ae9SGregory Neil Shapiro# check sender address: user@address, user@, address
182806f25ae9SGregory Neil Shapirodnl should we remove +ext from user?
182940266059SGregory Neil Shapirodnl workspace: <mark> CanonicalAddress where mark is: ?, _RES_OK_, PERM, TEMP
183040266059SGregory Neil ShapiroR<$+> $+ < @ $* >	$: @<$1> <$2 < @ $3 >> $| <F:$2@$3> <U:$2@> <D:$3>
183106f25ae9SGregory Neil ShapiroR<$+> $+		$: @<$1> <$2> $| <U:$2@>
183206f25ae9SGregory Neil Shapirodnl workspace: @<mark> <CanonicalAddress> $| <@type:address> ....
183306f25ae9SGregory Neil Shapirodnl $| is used as delimiter, otherwise false matches may occur: <user<@domain>>
183406f25ae9SGregory Neil Shapirodnl will only return user<@domain when "reversing" the args
183506f25ae9SGregory Neil ShapiroR@ <$+> <$*> $| <$+>	$: <@> <$1> <$2> $| $>SearchList <+ From> $| <$3> <>
183606f25ae9SGregory Neil Shapirodnl workspace: <@><mark> <CanonicalAddress> $| <result>
183706f25ae9SGregory Neil ShapiroR<@> <$+> <$*> $| <$*>	$: <$3> <$1> <$2>		reverse result
183806f25ae9SGregory Neil Shapirodnl workspace: <result> <mark> <CanonicalAddress>
1839c2aa98e2SPeter Wemm# retransform for further use
184006f25ae9SGregory Neil Shapirodnl required form:
184106f25ae9SGregory Neil Shapirodnl <ResultOfLookup|mark> CanonicalAddress
184206f25ae9SGregory Neil ShapiroR<?> <$+> <$*>		$: <$1> $2	no match
184306f25ae9SGregory Neil ShapiroR<$+> <$+> <$*>		$: <$1> $3	relevant result, keep it', `dnl')
184406f25ae9SGregory Neil Shapirodnl workspace <ResultOfLookup|mark> CanonicalAddress
184506f25ae9SGregory Neil Shapirodnl mark is ? iff the address is user (wo @domain)
1846c2aa98e2SPeter Wemm
1847c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl
1848c2aa98e2SPeter Wemm# handle case of no @domain on address
184906f25ae9SGregory Neil Shapirodnl prepend daemon_flags
185006f25ae9SGregory Neil ShapiroR<?> $*			$: $&{daemon_flags} $| <?> $1
185106f25ae9SGregory Neil Shapirodnl accept unqualified sender: change mark to avoid test
185240266059SGregory Neil ShapiroR$* u $* $| <?> $*	$: <_RES_OK_> $3
185306f25ae9SGregory Neil Shapirodnl remove daemon_flags
185406f25ae9SGregory Neil ShapiroR$* $| $*		$: $2
185513bd1963SGregory Neil ShapiroR<?> $*			$: < ? $&{client_addr} > $1
1856959366dcSGregory Neil ShapiroR<?> $*			$@ <_RES_OK_>			...local unqualed ok
185740266059SGregory Neil ShapiroR<? $+> $*		$#error $@ 5.5.4 $: "_CODE553 Domain name required for sender address " $&f
1858c2aa98e2SPeter Wemm							...remote is not')
1859c2aa98e2SPeter Wemm# check results
186006f25ae9SGregory Neil ShapiroR<?> $*			$: @ $1		mark address: nothing known about it
186140266059SGregory Neil ShapiroR<$={ResOk}> $*		$@ <_RES_OK_>	domain ok: stop
186206f25ae9SGregory Neil ShapiroR<TEMP> $*		$#error $@ 4.1.8 $: "451 Domain of sender address " $&f " does not resolve"
186340266059SGregory Neil ShapiroR<PERM> $*		$#error $@ 5.1.8 $: "_CODE553 Domain of sender address " $&f " does not exist"
186406f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
186540266059SGregory Neil ShapiroR<$={Accept}> $*	$# $1		accept from access map
1866c2aa98e2SPeter WemmR<DISCARD> $*		$#discard $: discard
186740266059SGregory Neil Shapiroifdef(`_FFR_QUARANTINE',
186840266059SGregory Neil Shapiro`R<QUARANTINE:$+> $*	$#error $@ quarantine $: $1', `dnl')
186906f25ae9SGregory Neil ShapiroR<REJECT> $*		$#error ifdef(`confREJECT_MSG', `$: "confREJECT_MSG"', `$@ 5.7.1 $: "550 Access denied"')
187006f25ae9SGregory Neil Shapirodnl error tag
187106f25ae9SGregory Neil ShapiroR<ERROR:$-.$-.$-:$+> $*		$#error $@ $1.$2.$3 $: $4
187206f25ae9SGregory Neil ShapiroR<ERROR:$+> $*		$#error $: $1
187340266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<_ATMPF_> $*		$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
187406f25ae9SGregory Neil Shapirodnl generic error from access map
187506f25ae9SGregory Neil ShapiroR<$+> $*		$#error $: $1		error from access db',
1876c2aa98e2SPeter Wemm`dnl')
1877c2aa98e2SPeter Wemm
1878c2aa98e2SPeter Wemm######################################################################
1879c2aa98e2SPeter Wemm###  check_rcpt -- check SMTP ``RCPT TO:'' command argument
1880c2aa98e2SPeter Wemm######################################################################
1881c2aa98e2SPeter Wemm
1882c2aa98e2SPeter WemmSLocal_check_rcpt
188306f25ae9SGregory Neil ShapiroScheck`'_U_`'rcpt
1884c2aa98e2SPeter WemmR$*			$: $1 $| $>"Local_check_rcpt" $1
1885c2aa98e2SPeter WemmR$* $| $#$*		$#$2
1886c2aa98e2SPeter WemmR$* $| $*		$@ $>"Basic_check_rcpt" $1
1887c2aa98e2SPeter Wemm
1888c2aa98e2SPeter WemmSBasic_check_rcpt
188940266059SGregory Neil Shapiro# empty address?
189040266059SGregory Neil ShapiroR<>			$#error $@ nouser $: "553 User address required"
189140266059SGregory Neil ShapiroR$@			$#error $@ nouser $: "553 User address required"
1892c2aa98e2SPeter Wemm# check for deferred delivery mode
189394c01205SGregory Neil ShapiroR$*			$: < $&{deliveryMode} > $1
1894c2aa98e2SPeter WemmR< d > $*		$@ deferred
1895c2aa98e2SPeter WemmR< $* > $*		$: $2
1896c2aa98e2SPeter Wemm
189706f25ae9SGregory Neil Shapiroifdef(`_REQUIRE_QUAL_RCPT_', `dnl
189840266059SGregory Neil Shapirodnl this code checks for user@host where host is not a FQHN.
189940266059SGregory Neil Shapirodnl it is not activated.
190040266059SGregory Neil Shapirodnl notice: code to check for a recipient without a domain name is
190140266059SGregory Neil Shapirodnl available down below; look for the same macro.
190240266059SGregory Neil Shapirodnl this check is done here because the name might be qualified by the
190340266059SGregory Neil Shapirodnl canonicalization.
190440266059SGregory Neil Shapiro# require fully qualified domain part?
190540266059SGregory Neil Shapirodnl very simple canonification: make sure the address is in < >
190606f25ae9SGregory Neil ShapiroR$+			$: <?> $1
190706f25ae9SGregory Neil ShapiroR<?> <$+>		$: <@> <$1>
190806f25ae9SGregory Neil ShapiroR<?> $+			$: <@> <$1>
190940266059SGregory Neil ShapiroR<@> < postmaster >	$: postmaster
191013bd1963SGregory Neil ShapiroR<@> < $* @ $+ . $+ >	$: < $1 @ $2 . $3 >
191106f25ae9SGregory Neil Shapirodnl prepend daemon_flags
191240266059SGregory Neil ShapiroR<@> $*			$: $&{daemon_flags} $| <@> $1
191306f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <@> <address>
1914a7ec597cSGregory Neil Shapirodnl 'r'equire qual.rcpt: ok
1915a7ec597cSGregory Neil ShapiroR$* r $* $| <@> < $+ @ $+ >	$: < $3 @ $4 >
191606f25ae9SGregory Neil Shapirodnl do not allow these at all or only from local systems?
1917a7ec597cSGregory Neil ShapiroR$* r $* $| <@> < $* >	$: < ? $&{client_name} > < $3 >
191806f25ae9SGregory Neil ShapiroR<?> < $* >		$: <$1>
191906f25ae9SGregory Neil ShapiroR<? $=w> < $* >		$: <$1>
192040266059SGregory Neil ShapiroR<? $+> <$+>		$#error $@ 5.5.4 $: "553 Fully qualified domain name required"
192106f25ae9SGregory Neil Shapirodnl remove daemon_flags for other cases
192206f25ae9SGregory Neil ShapiroR$* $| <@> $*		$: $2', `dnl')
192306f25ae9SGregory Neil Shapiro
192440266059SGregory Neil Shapirodnl ##################################################################
192540266059SGregory Neil Shapirodnl call subroutines for recipient and relay
192640266059SGregory Neil Shapirodnl possible returns from subroutines:
192740266059SGregory Neil Shapirodnl $#TEMP	temporary failure
192840266059SGregory Neil Shapirodnl $#error	permanent failure (or temporary if from access map)
192940266059SGregory Neil Shapirodnl $#other	stop processing
193040266059SGregory Neil Shapirodnl RELAY	RELAYing allowed
193140266059SGregory Neil Shapirodnl other	otherwise
193240266059SGregory Neil Shapiro######################################################################
193340266059SGregory Neil ShapiroR$*			$: $1 $| @ $>"Rcpt_ok" $1
193440266059SGregory Neil Shapirodnl temporary failure? remove mark @ and remember
193540266059SGregory Neil ShapiroR$* $| @ $#TEMP $+	$: $1 $| T $2
193640266059SGregory Neil Shapirodnl error or ok (stop)
193740266059SGregory Neil ShapiroR$* $| @ $#$*		$#$2
193840266059SGregory Neil Shapiroifdef(`_PROMISCUOUS_RELAY_', `divert(-1)', `dnl')
193940266059SGregory Neil ShapiroR$* $| @ RELAY		$@ RELAY
194040266059SGregory Neil Shapirodnl something else: call check sender (relay)
194140266059SGregory Neil ShapiroR$* $| @ $*		$: O $| $>"Relay_ok" $1
194240266059SGregory Neil Shapirodnl temporary failure: call check sender (relay)
194340266059SGregory Neil ShapiroR$* $| T $+		$: T $2 $| $>"Relay_ok" $1
194440266059SGregory Neil Shapirodnl temporary failure? return that
194540266059SGregory Neil ShapiroR$* $| $#TEMP $+	$#error $2
194640266059SGregory Neil Shapirodnl error or ok (stop)
194740266059SGregory Neil ShapiroR$* $| $#$*		$#$2
194840266059SGregory Neil ShapiroR$* $| RELAY		$@ RELAY
194940266059SGregory Neil Shapirodnl something else: return previous temp failure
195040266059SGregory Neil ShapiroR T $+ $| $*		$#error $1
195140266059SGregory Neil Shapiro# anything else is bogus
195240266059SGregory Neil ShapiroR$*			$#error $@ 5.7.1 $: confRELAY_MSG
195340266059SGregory Neil Shapirodivert(0)
195440266059SGregory Neil Shapiro
195540266059SGregory Neil Shapiro######################################################################
195640266059SGregory Neil Shapiro### Rcpt_ok: is the recipient ok?
195740266059SGregory Neil Shapirodnl input: recipient address (RCPT TO)
195840266059SGregory Neil Shapirodnl output: see explanation at call
195940266059SGregory Neil Shapiro######################################################################
196040266059SGregory Neil ShapiroSRcpt_ok
1961c2aa98e2SPeter Wemmifdef(`_LOOSE_RELAY_CHECK_',`dnl
1962065a643dSPeter WemmR$*			$: $>CanonAddr $1
1963c2aa98e2SPeter WemmR$* < @ $* . >		$1 < @ $2 >			strip trailing dots',
1964c2aa98e2SPeter Wemm`R$*			$: $>ParseRecipient $1		strip relayable hosts')
1965c2aa98e2SPeter Wemm
1966065a643dSPeter Wemmifdef(`_BESTMX_IS_LOCAL_',`dnl
1967065a643dSPeter Wemmifelse(_BESTMX_IS_LOCAL_, `', `dnl
1968065a643dSPeter Wemm# unlimited bestmx
1969065a643dSPeter WemmR$* < @ $* > $*			$: $1 < @ $2 @@ $(bestmx $2 $) > $3',
1970065a643dSPeter Wemm`dnl
1971065a643dSPeter Wemm# limit bestmx to $=B
19722e43090eSPeter WemmR$* < @ $* $=B > $*		$: $1 < @ $2 $3 @@ $(bestmx $2 $3 $) > $4')
197340266059SGregory Neil ShapiroR$* $=O $* < @ $* @@ $=w . > $*	$@ $>"Rcpt_ok" $1 $2 $3
1974065a643dSPeter WemmR$* < @ $* @@ $=w . > $*	$: $1 < @ $3 > $4
1975065a643dSPeter WemmR$* < @ $* @@ $* > $*		$: $1 < @ $2 > $4')
1976065a643dSPeter Wemm
1977c2aa98e2SPeter Wemmifdef(`_BLACKLIST_RCPT_',`dnl
197806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
1979c2aa98e2SPeter Wemm# blacklist local users or any host from receiving mail
1980c2aa98e2SPeter WemmR$*			$: <?> $1
198106f25ae9SGregory Neil Shapirodnl user is now tagged with @ to be consistent with check_mail
198206f25ae9SGregory Neil Shapirodnl and to distinguish users from hosts (com would be host, com@ would be user)
198340266059SGregory Neil ShapiroR<?> $+ < @ $=w >	$: <> <$1 < @ $2 >> $| <F:$1@$2> <U:$1@> <D:$2>
198440266059SGregory Neil ShapiroR<?> $+ < @ $* >	$: <> <$1 < @ $2 >> $| <F:$1@$2> <D:$2>
198506f25ae9SGregory Neil ShapiroR<?> $+			$: <> <$1> $| <U:$1@>
198606f25ae9SGregory Neil Shapirodnl $| is used as delimiter, otherwise false matches may occur: <user<@domain>>
198706f25ae9SGregory Neil Shapirodnl will only return user<@domain when "reversing" the args
198806f25ae9SGregory Neil ShapiroR<> <$*> $| <$+>	$: <@> <$1> $| $>SearchList <+ To> $| <$2> <>
198906f25ae9SGregory Neil ShapiroR<@> <$*> $| <$*>	$: <$2> <$1>		reverse result
199006f25ae9SGregory Neil ShapiroR<?> <$*>		$: @ $1		mark address as no match
199140266059SGregory Neil Shapirodnl we may have to filter here because otherwise some RHSs
199240266059SGregory Neil Shapirodnl would be interpreted as generic error messages...
199340266059SGregory Neil Shapirodnl error messages should be "tagged" by prefixing them with error: !
199440266059SGregory Neil Shapirodnl that would make a lot of things easier.
199506f25ae9SGregory Neil ShapiroR<$={Accept}> <$*>	$: @ $2		mark address as no match
199640266059SGregory Neil Shapiroifdef(`_ACCESS_SKIP_', `dnl
199740266059SGregory Neil ShapiroR<SKIP> <$*>		$: @ $1		mark address as no match', `dnl')
199840266059SGregory Neil Shapiroifdef(`_DELAY_COMPAT_8_10_',`dnl
199940266059SGregory Neil Shapirodnl compatility with 8.11/8.10:
200006f25ae9SGregory Neil Shapirodnl we have to filter these because otherwise they would be interpreted
200106f25ae9SGregory Neil Shapirodnl as generic error message...
200206f25ae9SGregory Neil Shapirodnl error messages should be "tagged" by prefixing them with error: !
200306f25ae9SGregory Neil Shapirodnl that would make a lot of things easier.
200406f25ae9SGregory Neil Shapirodnl maybe we should stop checks already here (if SPAM_xyx)?
200506f25ae9SGregory Neil ShapiroR<$={SpamTag}> <$*>	$: @ $2		mark address as no match')
200640266059SGregory Neil ShapiroR<REJECT> $*		$#error $@ 5.2.1 $: confRCPTREJ_MSG
200706f25ae9SGregory Neil ShapiroR<DISCARD> $*		$#discard $: discard
200840266059SGregory Neil Shapiroifdef(`_FFR_QUARANTINE',
200940266059SGregory Neil Shapiro`R<QUARANTINE:$+> $*	$#error $@ quarantine $: $1', `dnl')
201006f25ae9SGregory Neil Shapirodnl error tag
201106f25ae9SGregory Neil ShapiroR<ERROR:$-.$-.$-:$+> $*		$#error $@ $1.$2.$3 $: $4
201206f25ae9SGregory Neil ShapiroR<ERROR:$+> $*		$#error $: $1
201340266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<_ATMPF_> $*		$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
201406f25ae9SGregory Neil Shapirodnl generic error from access map
201506f25ae9SGregory Neil ShapiroR<$+> $*		$#error $: $1		error from access db
201606f25ae9SGregory Neil ShapiroR@ $*			$1		remove mark', `dnl')', `dnl')
2017c2aa98e2SPeter Wemm
201840266059SGregory Neil Shapiroifdef(`_PROMISCUOUS_RELAY_', `divert(-1)', `dnl')
201940266059SGregory Neil Shapiro# authenticated via TLS?
202040266059SGregory Neil ShapiroR$*			$: $1 $| $>RelayTLS	client authenticated?
202106f25ae9SGregory Neil ShapiroR$* $| $# $+		$# $2			error/ok?
202206f25ae9SGregory Neil ShapiroR$* $| $*		$: $1			no
202306f25ae9SGregory Neil Shapiro
202440266059SGregory Neil ShapiroR$*			$: $1 $| $>"Local_Relay_Auth" $&{auth_type}
202540266059SGregory Neil Shapirodnl workspace: localpart<@domain> $| result of Local_Relay_Auth
202640266059SGregory Neil ShapiroR$* $| $# $*		$# $2
202740266059SGregory Neil Shapirodnl if Local_Relay_Auth returns NO then do not check $={TrustAuthMech}
202840266059SGregory Neil ShapiroR$* $| NO		$: $1
202940266059SGregory Neil ShapiroR$* $| $*		$: $1 $| $&{auth_type}
203040266059SGregory Neil Shapirodnl workspace: localpart<@domain> [ $| ${auth_type} ]
203106f25ae9SGregory Neil Shapirodnl empty ${auth_type}?
203206f25ae9SGregory Neil ShapiroR$* $|			$: $1
203306f25ae9SGregory Neil Shapirodnl mechanism ${auth_type} accepted?
203406f25ae9SGregory Neil Shapirodnl use $# to override further tests (delay_checks): see check_rcpt below
203540266059SGregory Neil ShapiroR$* $| $={TrustAuthMech}	$# RELAY
203640266059SGregory Neil Shapirodnl remove ${auth_type}
203706f25ae9SGregory Neil ShapiroR$* $| $*		$: $1
2038193538b7SGregory Neil Shapirodnl workspace: localpart<@domain> | localpart
203906f25ae9SGregory Neil Shapiroifelse(defn(`_NO_UUCP_'), `r',
2040193538b7SGregory Neil Shapiro`R$* ! $* < @ $* >	$: <REMOTE> $2 < @ BANG_PATH >
2041193538b7SGregory Neil ShapiroR$* ! $* 		$: <REMOTE> $2 < @ BANG_PATH >', `dnl')
2042c2aa98e2SPeter Wemm# anything terminating locally is ok
2043c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl
204440266059SGregory Neil ShapiroR$+ < @ $* $=m >	$@ RELAY', `dnl')
204540266059SGregory Neil ShapiroR$+ < @ $=w >		$@ RELAY
2046c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_',
204740266059SGregory Neil Shapiro`R$+ < @ $=R >		$@ RELAY
204806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
204906f25ae9SGregory Neil ShapiroR$+ < @ $+ >		$: <$(access To:$2 $: ? $)> <$1 < @ $2 >>
205006f25ae9SGregory Neil Shapirodnl workspace: <Result-of-lookup | ?> <localpart<@domain>>
205106f25ae9SGregory Neil ShapiroR<?> <$+ < @ $+ >>	$: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')',
205240266059SGregory Neil Shapiro`R$+ < @ $* $=R >	$@ RELAY
205306f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
205440266059SGregory Neil ShapiroR$+ < @ $+ >		$: $>D <$2> <?> <+ To> <$1 < @ $2 >>',`dnl')')
205506f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
205606f25ae9SGregory Neil Shapirodnl workspace: <Result-of-lookup | ?> <localpart<@domain>>
205740266059SGregory Neil ShapiroR<RELAY> $*		$@ RELAY
205840266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<$* _ATMPF_> $*		$#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
2059c2aa98e2SPeter WemmR<$*> <$*>		$: $2',`dnl')
2060c2aa98e2SPeter Wemm
206106f25ae9SGregory Neil Shapiro
2062c2aa98e2SPeter Wemmifdef(`_RELAY_MX_SERVED_', `dnl
2063c2aa98e2SPeter Wemm# allow relaying for hosts which we MX serve
206406f25ae9SGregory Neil ShapiroR$+ < @ $+ >		$: < : $(mxserved $2 $) : > $1 < @ $2 >
206506f25ae9SGregory Neil Shapirodnl this must not necessarily happen if the client is checked first...
206640266059SGregory Neil ShapiroR< : $* <TEMP> : > $*	$#TEMP $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1
206740266059SGregory Neil ShapiroR<$* : $=w . : $*> $*	$@ RELAY
2068065a643dSPeter WemmR< : $* : > $*		$: $2',
2069c2aa98e2SPeter Wemm`dnl')
2070c2aa98e2SPeter Wemm
2071c2aa98e2SPeter Wemm# check for local user (i.e. unqualified address)
2072c2aa98e2SPeter WemmR$*			$: <?> $1
2073065a643dSPeter WemmR<?> $* < @ $+ >	$: <REMOTE> $1 < @ $2 >
2074c2aa98e2SPeter Wemm# local user is ok
207506f25ae9SGregory Neil Shapirodnl is it really? the standard requires user@domain, not just user
207606f25ae9SGregory Neil Shapirodnl but we should accept it anyway (maybe making it an option:
207706f25ae9SGregory Neil Shapirodnl RequireFQDN ?)
207806f25ae9SGregory Neil Shapirodnl postmaster must be accepted without domain (DRUMS)
207906f25ae9SGregory Neil Shapiroifdef(`_REQUIRE_QUAL_RCPT_', `dnl
208040266059SGregory Neil ShapiroR<?> postmaster		$@ OK
208106f25ae9SGregory Neil Shapiro# require qualified recipient?
208206f25ae9SGregory Neil Shapirodnl prepend daemon_flags
208306f25ae9SGregory Neil ShapiroR<?> $+			$: $&{daemon_flags} $| <?> $1
208406f25ae9SGregory Neil Shapirodnl workspace: ${daemon_flags} $| <?> localpart
208506f25ae9SGregory Neil Shapirodnl do not allow these at all or only from local systems?
208606f25ae9SGregory Neil Shapirodnl r flag? add client_name
208706f25ae9SGregory Neil ShapiroR$* r $* $| <?> $+	$: < ? $&{client_name} > <?> $3
208806f25ae9SGregory Neil Shapirodnl no r flag: relay to local user (only local part)
208906f25ae9SGregory Neil Shapiro# no qualified recipient required
209040266059SGregory Neil ShapiroR$* $| <?> $+		$@ RELAY
209106f25ae9SGregory Neil Shapirodnl client_name is empty
209240266059SGregory Neil ShapiroR<?> <?> $+		$@ RELAY
209306f25ae9SGregory Neil Shapirodnl client_name is local
209440266059SGregory Neil ShapiroR<? $=w> <?> $+		$@ RELAY
209506f25ae9SGregory Neil Shapirodnl client_name is not local
209606f25ae9SGregory Neil ShapiroR<? $+> $+		$#error $@ 5.5.4 $: "553 Domain name required"', `dnl
209706f25ae9SGregory Neil Shapirodnl no qualified recipient required
209840266059SGregory Neil ShapiroR<?> $+			$@ RELAY')
209906f25ae9SGregory Neil Shapirodnl it is a remote user: remove mark and then check client
2100c2aa98e2SPeter WemmR<$+> $*		$: $2
210106f25ae9SGregory Neil Shapirodnl currently the recipient address is not used below
2102c2aa98e2SPeter Wemm
210340266059SGregory Neil Shapiro######################################################################
210440266059SGregory Neil Shapiro### Relay_ok: is the relay/sender ok?
210540266059SGregory Neil Shapirodnl input: ignored
210640266059SGregory Neil Shapirodnl output: see explanation at call
210740266059SGregory Neil Shapiro######################################################################
210840266059SGregory Neil ShapiroSRelay_ok
2109c2aa98e2SPeter Wemm# anything originating locally is ok
2110c2aa98e2SPeter Wemm# check IP address
2111c2aa98e2SPeter WemmR$*			$: $&{client_addr}
211240266059SGregory Neil ShapiroR$@			$@ RELAY		originated locally
211340266059SGregory Neil ShapiroR0			$@ RELAY		originated locally
211413bd1963SGregory Neil ShapiroR127.0.0.1		$@ RELAY		originated locally
211513bd1963SGregory Neil ShapiroRIPv6:::1		$@ RELAY		originated locally
211640266059SGregory Neil ShapiroR$=R $*			$@ RELAY		relayable IP address
211706f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
211840266059SGregory Neil ShapiroR$*			$: $>A <$1> <?> <+ Connect> <$1>
211940266059SGregory Neil ShapiroR<RELAY> $* 		$@ RELAY		relayable IP address
2120959366dcSGregory Neil Shapiroifdef(`_FFR_REJECT_IP_IN_CHECK_RCPT_',`dnl
2121959366dcSGregory Neil Shapirodnl this will cause rejections in cases like:
2122959366dcSGregory Neil Shapirodnl Connect:My.Host.Domain	RELAY
2123959366dcSGregory Neil Shapirodnl Connect:My.Net		REJECT
2124959366dcSGregory Neil Shapirodnl since in check_relay client_name is checked before client_addr
2125959366dcSGregory Neil ShapiroR<REJECT> $* 		$@ REJECT		rejected IP address')
212640266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<_ATMPF_> $*		$#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
2127c2aa98e2SPeter WemmR<$*> <$*>		$: $2', `dnl')
2128c2aa98e2SPeter WemmR$*			$: [ $1 ]		put brackets around it...
212940266059SGregory Neil ShapiroR$=w			$@ RELAY		... and see if it is local
2130c2aa98e2SPeter Wemm
213106f25ae9SGregory Neil Shapiroifdef(`_RELAY_DB_FROM_', `define(`_RELAY_MAIL_FROM_', `1')')dnl
213206f25ae9SGregory Neil Shapiroifdef(`_RELAY_LOCAL_FROM_', `define(`_RELAY_MAIL_FROM_', `1')')dnl
213306f25ae9SGregory Neil Shapiroifdef(`_RELAY_MAIL_FROM_', `dnl
213406f25ae9SGregory Neil Shapirodnl input: {client_addr} or something "broken"
213506f25ae9SGregory Neil Shapirodnl just throw the input away; we do not need it.
213606f25ae9SGregory Neil Shapiro# check whether FROM is allowed to use system as relay
213706f25ae9SGregory Neil ShapiroR$*			$: <?> $>CanonAddr $&f
213840266059SGregory Neil ShapiroR<?> $+ < @ $+ . >	<?> $1 < @ $2 >		remove trailing dot
2139c2aa98e2SPeter Wemmifdef(`_RELAY_LOCAL_FROM_', `dnl
214006f25ae9SGregory Neil Shapiro# check whether local FROM is ok
214140266059SGregory Neil ShapiroR<?> $+ < @ $=w >	$@ RELAY		FROM local', `dnl')
214206f25ae9SGregory Neil Shapiroifdef(`_RELAY_DB_FROM_', `dnl
2143605302a5SGregory Neil ShapiroR<?> $+ < @ $+ >	$: <@> $>SearchList <! From> $| <F:$1@$2> ifdef(`_RELAY_DB_FROM_DOMAIN_', ifdef(`_RELAY_HOSTS_ONLY_', `<E:$2>', `<D:$2>')) <>
214440266059SGregory Neil ShapiroR<@> <RELAY>		$@ RELAY		RELAY FROM sender ok
214540266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<@> <_ATMPF_>		$#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
214640266059SGregory Neil Shapiro', `dnl
214740266059SGregory Neil Shapiroifdef(`_RELAY_DB_FROM_DOMAIN_',
214840266059SGregory Neil Shapiro`errprint(`*** ERROR: _RELAY_DB_FROM_DOMAIN_ requires _RELAY_DB_FROM_
214906f25ae9SGregory Neil Shapiro')',
215006f25ae9SGregory Neil Shapiro`dnl')
215106f25ae9SGregory Neil Shapirodnl')', `dnl')
215240266059SGregory Neil Shapirodnl notice: the rulesets above do not leave a unique workspace behind.
215340266059SGregory Neil Shapirodnl it does not matter in this case because the following rule ignores
215440266059SGregory Neil Shapirodnl the input. otherwise these rules must "clean up" the workspace.
215506f25ae9SGregory Neil Shapiro
215606f25ae9SGregory Neil Shapiro# check client name: first: did it resolve?
215706f25ae9SGregory Neil Shapirodnl input: ignored
215806f25ae9SGregory Neil ShapiroR$*			$: < $&{client_resolve} >
215940266059SGregory Neil ShapiroR<TEMP>			$#TEMP $@ 4.7.1 $: "450 Relaying temporarily denied. Cannot resolve PTR record for " $&{client_addr}
216006f25ae9SGregory Neil ShapiroR<FORGED>		$#error $@ 5.7.1 $: "550 Relaying denied. IP name possibly forged " $&{client_name}
216106f25ae9SGregory Neil ShapiroR<FAIL>			$#error $@ 5.7.1 $: "550 Relaying denied. IP name lookup failed " $&{client_name}
216206f25ae9SGregory Neil Shapirodnl ${client_resolve} should be OK, so go ahead
216340266059SGregory Neil ShapiroR$*			$: <@> $&{client_name}
216406f25ae9SGregory Neil Shapirodnl should not be necessary since it has been done for client_addr already
216513bd1963SGregory Neil Shapirodnl this rule actually may cause a problem if {client_name} resolves to ""
216613bd1963SGregory Neil Shapirodnl however, this should not happen since the forward lookup should fail
216713bd1963SGregory Neil Shapirodnl and {client_resolve} should be TEMP or FAIL.
216813bd1963SGregory Neil Shapirodnl nevertheless, removing the rule doesn't hurt.
216913bd1963SGregory Neil Shapirodnl R<@>			$@ RELAY
217040266059SGregory Neil Shapirodnl workspace: <@> ${client_name} (not empty)
217140266059SGregory Neil Shapiro# pass to name server to make hostname canonical
217240266059SGregory Neil ShapiroR<@> $* $=P 		$:<?>  $1 $2
217340266059SGregory Neil ShapiroR<@> $+			$:<?>  $[ $1 $]
217440266059SGregory Neil Shapirodnl workspace: <?> ${client_name} (canonified)
217540266059SGregory Neil ShapiroR$* .			$1			strip trailing dots
217606f25ae9SGregory Neil Shapiroifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl
217740266059SGregory Neil ShapiroR<?> $* $=m		$@ RELAY', `dnl')
217840266059SGregory Neil ShapiroR<?> $=w		$@ RELAY
217906f25ae9SGregory Neil Shapiroifdef(`_RELAY_HOSTS_ONLY_',
218040266059SGregory Neil Shapiro`R<?> $=R		$@ RELAY
218106f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
218206f25ae9SGregory Neil ShapiroR<?> $*			$: <$(access Connect:$1 $: ? $)> <$1>
218306f25ae9SGregory Neil ShapiroR<?> <$*>		$: <$(access $1 $: ? $)> <$1>',`dnl')',
218440266059SGregory Neil Shapiro`R<?> $* $=R			$@ RELAY
218506f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
218640266059SGregory Neil ShapiroR<?> $*			$: $>D <$1> <?> <+ Connect> <$1>',`dnl')')
218706f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
218840266059SGregory Neil ShapiroR<RELAY> $*		$@ RELAY
218940266059SGregory Neil Shapiroifdef(`_ATMPF_', `R<$* _ATMPF_> $*		$#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
219006f25ae9SGregory Neil ShapiroR<$*> <$*>		$: $2',`dnl')
219140266059SGregory Neil Shapirodnl end of _PROMISCUOUS_RELAY_
219206f25ae9SGregory Neil Shapirodivert(0)
219306f25ae9SGregory Neil Shapiroifdef(`_DELAY_CHECKS_',`dnl
219406f25ae9SGregory Neil Shapiro# turn a canonical address in the form user<@domain>
219506f25ae9SGregory Neil Shapiro# qualify unqual. addresses with $j
219606f25ae9SGregory Neil Shapirodnl it might have been only user (without <@domain>)
219706f25ae9SGregory Neil ShapiroSFullAddr
219806f25ae9SGregory Neil ShapiroR$* <@ $+ . >		$1 <@ $2 >
219906f25ae9SGregory Neil ShapiroR$* <@ $* >		$@ $1 <@ $2 >
220006f25ae9SGregory Neil ShapiroR$+			$@ $1 <@ $j >
2201c2aa98e2SPeter Wemm
2202a7ec597cSGregory Neil ShapiroSDelay_TLS_Clt
220313bd1963SGregory Neil Shapiro# authenticated?
220413bd1963SGregory Neil Shapirodnl code repeated here from Basic_check_mail
220513bd1963SGregory Neil Shapirodnl only called from check_rcpt in delay mode if checkrcpt returns $#
220613bd1963SGregory Neil ShapiroR$*			$: $1 $| $>"tls_client" $&{verify} $| MAIL
220713bd1963SGregory Neil ShapiroR$* $| $#$+		$#$2
220813bd1963SGregory Neil Shapirodnl return result from checkrcpt
2209a7ec597cSGregory Neil ShapiroR$* $| $*		$# $1
221013bd1963SGregory Neil ShapiroR$*			$# $1
221113bd1963SGregory Neil Shapiro
2212a7ec597cSGregory Neil ShapiroSDelay_TLS_Clt2
221313bd1963SGregory Neil Shapiro# authenticated?
221413bd1963SGregory Neil Shapirodnl code repeated here from Basic_check_mail
221513bd1963SGregory Neil Shapirodnl only called from check_rcpt in delay mode if stopping due to Friend/Hater
221613bd1963SGregory Neil ShapiroR$*			$: $1 $| $>"tls_client" $&{verify} $| MAIL
221713bd1963SGregory Neil ShapiroR$* $| $#$+		$#$2
221813bd1963SGregory Neil Shapirodnl return result from friend/hater check
2219a7ec597cSGregory Neil ShapiroR$* $| $*		$@ $1
222013bd1963SGregory Neil ShapiroR$*			$@ $1
222113bd1963SGregory Neil Shapiro
222206f25ae9SGregory Neil Shapiro# call all necessary rulesets
222306f25ae9SGregory Neil ShapiroScheck_rcpt
222406f25ae9SGregory Neil Shapirodnl this test should be in the Basic_check_rcpt ruleset
222506f25ae9SGregory Neil Shapirodnl which is the correct DSN code?
222606f25ae9SGregory Neil Shapiro# R$@			$#error $@ 5.1.3 $: "553 Recipient address required"
222713bd1963SGregory Neil Shapiro
222806f25ae9SGregory Neil ShapiroR$+			$: $1 $| $>checkrcpt $1
222906f25ae9SGregory Neil Shapirodnl now we can simply stop checks by returning "$# xyz" instead of just "ok"
223013bd1963SGregory Neil Shapirodnl on error (or discard) stop now
223113bd1963SGregory Neil ShapiroR$+ $| $#error $*	$#error $2
223213bd1963SGregory Neil ShapiroR$+ $| $#discard $*	$#discard $2
223313bd1963SGregory Neil Shapirodnl otherwise call tls_client; see above
2234a7ec597cSGregory Neil ShapiroR$+ $| $#$*		$@ $>"Delay_TLS_Clt" $2
223506f25ae9SGregory Neil ShapiroR$+ $| $*		$: <?> $>FullAddr $>CanonAddr $1
223606f25ae9SGregory Neil Shapiroifdef(`_SPAM_FH_',
223706f25ae9SGregory Neil Shapiro`dnl lookup user@ and user@address
223806f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `',
223906f25ae9SGregory Neil Shapiro`errprint(`*** ERROR: FEATURE(`delay_checks', `argument') requires FEATURE(`access_db')
224006f25ae9SGregory Neil Shapiro')')dnl
224106f25ae9SGregory Neil Shapirodnl one of the next two rules is supposed to match
224206f25ae9SGregory Neil Shapirodnl this code has been copied from BLACKLIST... etc
224306f25ae9SGregory Neil Shapirodnl and simplified by omitting some < >.
224440266059SGregory Neil ShapiroR<?> $+ < @ $=w >	$: <> $1 < @ $2 > $| <F: $1@$2 > <D: $2 > <U: $1@>
224540266059SGregory Neil ShapiroR<?> $+ < @ $* >	$: <> $1 < @ $2 > $| <F: $1@$2 > <D: $2 >
224606f25ae9SGregory Neil Shapirodnl R<?>		$@ something_is_very_wrong_here
224740266059SGregory Neil Shapiro# lookup the addresses only with Spam tag
224840266059SGregory Neil ShapiroR<> $* $| <$+>		$: <@> $1 $| $>SearchList <! Spam> $| <$2> <>
224906f25ae9SGregory Neil ShapiroR<@> $* $| $*		$: $2 $1		reverse result
225006f25ae9SGregory Neil Shapirodnl', `dnl')
225106f25ae9SGregory Neil Shapiroifdef(`_SPAM_FRIEND_',
225206f25ae9SGregory Neil Shapiro`# is the recipient a spam friend?
225306f25ae9SGregory Neil Shapiroifdef(`_SPAM_HATER_',
225413bd1963SGregory Neil Shapiro	`errprint(`*** ERROR: define either Hater or Friend -- not both.
225506f25ae9SGregory Neil Shapiro')', `dnl')
2256a7ec597cSGregory Neil ShapiroR<FRIEND> $+		$@ $>"Delay_TLS_Clt2" SPAMFRIEND
225706f25ae9SGregory Neil ShapiroR<$*> $+		$: $2',
225806f25ae9SGregory Neil Shapiro`dnl')
225906f25ae9SGregory Neil Shapiroifdef(`_SPAM_HATER_',
226006f25ae9SGregory Neil Shapiro`# is the recipient no spam hater?
226140266059SGregory Neil ShapiroR<HATER> $+		$: $1			spam hater: continue checks
2262a7ec597cSGregory Neil ShapiroR<$*> $+		$@ $>"Delay_TLS_Clt2" NOSPAMHATER	everyone else: stop
226306f25ae9SGregory Neil Shapirodnl',`dnl')
226406f25ae9SGregory Neil Shapirodnl run further checks: check_mail
226506f25ae9SGregory Neil Shapirodnl should we "clean up" $&f?
226640266059SGregory Neil Shapiroifdef(`_FFR_MAIL_MACRO',
226740266059SGregory Neil Shapiro`R$*			$: $1 $| $>checkmail $&{mail_from}',
226840266059SGregory Neil Shapiro`R$*			$: $1 $| $>checkmail <$&f>')
2269605302a5SGregory Neil Shapirodnl recipient (canonical format) $| result of checkmail
227006f25ae9SGregory Neil ShapiroR$* $| $#$*		$#$2
227106f25ae9SGregory Neil Shapirodnl run further checks: check_relay
2272605302a5SGregory Neil ShapiroR$* $| $*		$: $1 $| $>checkrelay $&{client_name} $| $&{client_addr}
227306f25ae9SGregory Neil ShapiroR$* $| $#$*		$#$2
227406f25ae9SGregory Neil ShapiroR$* $| $*		$: $1
227506f25ae9SGregory Neil Shapiro', `dnl')
227640266059SGregory Neil Shapiro
227740266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl', `divert(-1)')
227840266059SGregory Neil Shapiro######################################################################
227940266059SGregory Neil Shapiro###  F: LookUpFull -- search for an entry in access database
228040266059SGregory Neil Shapiro###
228140266059SGregory Neil Shapiro###	lookup of full key (which should be an address) and
228240266059SGregory Neil Shapiro###	variations if +detail exists: +* and without +detail
228340266059SGregory Neil Shapiro###
228440266059SGregory Neil Shapiro###	Parameters:
228540266059SGregory Neil Shapiro###		<$1> -- key
228640266059SGregory Neil Shapiro###		<$2> -- default (what to return if not found in db)
228740266059SGregory Neil Shapirodnl			must not be empty
228840266059SGregory Neil Shapiro###		<$3> -- mark (must be <(!|+) single-token>)
228940266059SGregory Neil Shapiro###			! does lookup only with tag
229040266059SGregory Neil Shapiro###			+ does lookup with and without tag
229140266059SGregory Neil Shapiro###		<$4> -- passthru (additional data passed unchanged through)
229240266059SGregory Neil Shapirodnl returns:		<default> <passthru>
229340266059SGregory Neil Shapirodnl 			<result> <passthru>
229440266059SGregory Neil Shapiro######################################################################
229540266059SGregory Neil Shapiro
229640266059SGregory Neil ShapiroSF
229740266059SGregory Neil Shapirodnl workspace: <key> <def> <o tag> <thru>
229840266059SGregory Neil Shapirodnl full lookup
229940266059SGregory Neil Shapirodnl    2    3  4    5
230040266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*>		$: <$(access $4`'_TAG_DELIM_`'$1 $: ? $)> <$1> <$2> <$3 $4> <$5>
230140266059SGregory Neil Shapirodnl no match, try without tag
230240266059SGregory Neil Shapirodnl   1    2      3    4
230340266059SGregory Neil ShapiroR<?> <$+> <$*> <+ $-> <$*>	$: <$(access $1 $: ? $)> <$1> <$2> <+ $3> <$4>
230440266059SGregory Neil Shapirodnl no match, +detail: try +*
230540266059SGregory Neil Shapirodnl   1    2    3    4    5  6    7
230640266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <$- $-> <$*>
230740266059SGregory Neil Shapiro			$: <$(access $6`'_TAG_DELIM_`'$1+*@$3 $: ? $)> <$1+$2@$3> <$4> <$5 $6> <$7>
230840266059SGregory Neil Shapirodnl no match, +detail: try +* without tag
230940266059SGregory Neil Shapirodnl   1    2    3    4      5    6
231040266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <+ $-> <$*>
231140266059SGregory Neil Shapiro			$: <$(access $1+*@$3 $: ? $)> <$1+$2@$3> <$4> <+ $5> <$6>
231240266059SGregory Neil Shapirodnl no match, +detail: try without +detail
231340266059SGregory Neil Shapirodnl   1    2    3    4    5  6    7
231440266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <$- $-> <$*>
231540266059SGregory Neil Shapiro			$: <$(access $6`'_TAG_DELIM_`'$1@$3 $: ? $)> <$1+$2@$3> <$4> <$5 $6> <$7>
231640266059SGregory Neil Shapirodnl no match, +detail: try without +detail and without tag
231740266059SGregory Neil Shapirodnl   1    2    3    4      5    6
231840266059SGregory Neil ShapiroR<?> <$+ + $* @ $+> <$*> <+ $-> <$*>
231940266059SGregory Neil Shapiro			$: <$(access $1@$3 $: ? $)> <$1+$2@$3> <$4> <+ $5> <$6>
232040266059SGregory Neil Shapirodnl no match, return <default> <passthru>
232140266059SGregory Neil Shapirodnl   1    2    3  4    5
232240266059SGregory Neil ShapiroR<?> <$+> <$*> <$- $-> <$*>	$@ <$2> <$5>
232340266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
232440266059SGregory Neil Shapirodnl            2    3  4    5
232540266059SGregory Neil ShapiroR<$+ _ATMPF_> <$*> <$- $-> <$*>	$@ <_ATMPF_> <$5>', `dnl')
232640266059SGregory Neil Shapirodnl match, return <match> <passthru>
232740266059SGregory Neil Shapirodnl    2    3  4    5
232840266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*>		$@ <$1> <$5>
232940266059SGregory Neil Shapiro
233040266059SGregory Neil Shapiro######################################################################
233140266059SGregory Neil Shapiro###  E: LookUpExact -- search for an entry in access database
233240266059SGregory Neil Shapiro###
233340266059SGregory Neil Shapiro###	Parameters:
233440266059SGregory Neil Shapiro###		<$1> -- key
233540266059SGregory Neil Shapiro###		<$2> -- default (what to return if not found in db)
233640266059SGregory Neil Shapirodnl			must not be empty
233740266059SGregory Neil Shapiro###		<$3> -- mark (must be <(!|+) single-token>)
233840266059SGregory Neil Shapiro###			! does lookup only with tag
233940266059SGregory Neil Shapiro###			+ does lookup with and without tag
234040266059SGregory Neil Shapiro###		<$4> -- passthru (additional data passed unchanged through)
234140266059SGregory Neil Shapirodnl returns:		<default> <passthru>
234240266059SGregory Neil Shapirodnl 			<result> <passthru>
234340266059SGregory Neil Shapiro######################################################################
234440266059SGregory Neil Shapiro
234540266059SGregory Neil ShapiroSE
234640266059SGregory Neil Shapirodnl    2    3  4    5
234740266059SGregory Neil ShapiroR<$*> <$*> <$- $-> <$*>		$: <$(access $4`'_TAG_DELIM_`'$1 $: ? $)> <$1> <$2> <$3 $4> <$5>
234840266059SGregory Neil Shapirodnl no match, try without tag
234940266059SGregory Neil Shapirodnl   1    2      3    4
235040266059SGregory Neil ShapiroR<?> <$+> <$*> <+ $-> <$*>	$: <$(access $1 $: ? $)> <$1> <$2> <+ $3> <$4>
235140266059SGregory Neil Shapirodnl no match, return default passthru
235240266059SGregory Neil Shapirodnl   1    2    3  4    5
235340266059SGregory Neil ShapiroR<?> <$+> <$*> <$- $-> <$*>	$@ <$2> <$5>
235440266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
235540266059SGregory Neil Shapirodnl            2    3  4    5
235640266059SGregory Neil ShapiroR<$+ _ATMPF_> <$*> <$- $-> <$*>	$@ <_ATMPF_> <$5>', `dnl')
235740266059SGregory Neil Shapirodnl match, return <match> <passthru>
235840266059SGregory Neil Shapirodnl    2    3  4    5
235940266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*>		$@ <$1> <$5>
236040266059SGregory Neil Shapiro
236140266059SGregory Neil Shapiro######################################################################
236240266059SGregory Neil Shapiro###  U: LookUpUser -- search for an entry in access database
236340266059SGregory Neil Shapiro###
236440266059SGregory Neil Shapiro###	lookup of key (which should be a local part) and
236540266059SGregory Neil Shapiro###	variations if +detail exists: +* and without +detail
236640266059SGregory Neil Shapiro###
236740266059SGregory Neil Shapiro###	Parameters:
236840266059SGregory Neil Shapiro###		<$1> -- key (user@)
236940266059SGregory Neil Shapiro###		<$2> -- default (what to return if not found in db)
237040266059SGregory Neil Shapirodnl			must not be empty
237140266059SGregory Neil Shapiro###		<$3> -- mark (must be <(!|+) single-token>)
237240266059SGregory Neil Shapiro###			! does lookup only with tag
237340266059SGregory Neil Shapiro###			+ does lookup with and without tag
237440266059SGregory Neil Shapiro###		<$4> -- passthru (additional data passed unchanged through)
237540266059SGregory Neil Shapirodnl returns:		<default> <passthru>
237640266059SGregory Neil Shapirodnl 			<result> <passthru>
237740266059SGregory Neil Shapiro######################################################################
237840266059SGregory Neil Shapiro
237940266059SGregory Neil ShapiroSU
238040266059SGregory Neil Shapirodnl user lookups are always with trailing @
238140266059SGregory Neil Shapirodnl    2    3  4    5
238240266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*>		$: <$(access $4`'_TAG_DELIM_`'$1 $: ? $)> <$1> <$2> <$3 $4> <$5>
238340266059SGregory Neil Shapirodnl no match, try without tag
238440266059SGregory Neil Shapirodnl   1    2      3    4
238540266059SGregory Neil ShapiroR<?> <$+> <$*> <+ $-> <$*>	$: <$(access $1 $: ? $)> <$1> <$2> <+ $3> <$4>
238640266059SGregory Neil Shapirodnl do not remove the @ from the lookup:
238740266059SGregory Neil Shapirodnl it is part of the +detail@ which is omitted for the lookup
238840266059SGregory Neil Shapirodnl no match, +detail: try +*
238940266059SGregory Neil Shapirodnl   1    2      3    4  5    6
239040266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <$- $-> <$*>
239140266059SGregory Neil Shapiro			$: <$(access $5`'_TAG_DELIM_`'$1+*@ $: ? $)> <$1+$2@> <$3> <$4 $5> <$6>
239240266059SGregory Neil Shapirodnl no match, +detail: try +* without tag
239340266059SGregory Neil Shapirodnl   1    2      3      4    5
239440266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <+ $-> <$*>
239540266059SGregory Neil Shapiro			$: <$(access $1+*@ $: ? $)> <$1+$2@> <$3> <+ $4> <$5>
239640266059SGregory Neil Shapirodnl no match, +detail: try without +detail
239740266059SGregory Neil Shapirodnl   1    2      3    4  5    6
239840266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <$- $-> <$*>
239940266059SGregory Neil Shapiro			$: <$(access $5`'_TAG_DELIM_`'$1@ $: ? $)> <$1+$2@> <$3> <$4 $5> <$6>
240040266059SGregory Neil Shapirodnl no match, +detail: try without +detail and without tag
240140266059SGregory Neil Shapirodnl   1    2      3      4    5
240240266059SGregory Neil ShapiroR<?> <$+ + $* @> <$*> <+ $-> <$*>
240340266059SGregory Neil Shapiro			$: <$(access $1@ $: ? $)> <$1+$2@> <$3> <+ $4> <$5>
240440266059SGregory Neil Shapirodnl no match, return <default> <passthru>
240540266059SGregory Neil Shapirodnl   1    2    3  4    5
240640266059SGregory Neil ShapiroR<?> <$+> <$*> <$- $-> <$*>	$@ <$2> <$5>
240740266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
240840266059SGregory Neil Shapirodnl            2    3  4    5
240940266059SGregory Neil ShapiroR<$+ _ATMPF_> <$*> <$- $-> <$*>	$@ <_ATMPF_> <$5>', `dnl')
241040266059SGregory Neil Shapirodnl match, return <match> <passthru>
241140266059SGregory Neil Shapirodnl    2    3  4    5
241240266059SGregory Neil ShapiroR<$+> <$*> <$- $-> <$*>		$@ <$1> <$5>
241340266059SGregory Neil Shapiro
241406f25ae9SGregory Neil Shapiro######################################################################
241506f25ae9SGregory Neil Shapiro###  SearchList: search a list of items in the access map
241606f25ae9SGregory Neil Shapiro###	Parameters:
241706f25ae9SGregory Neil Shapiro###		<exact tag> $| <mark:address> <mark:address> ... <>
241806f25ae9SGregory Neil Shapirodnl	maybe we should have a @ (again) in front of the mark to
241906f25ae9SGregory Neil Shapirodnl	avoid errorneous matches (with error messages?)
242006f25ae9SGregory Neil Shapirodnl	if we can make sure that tag is always a single token
242106f25ae9SGregory Neil Shapirodnl	then we can omit the delimiter $|, otherwise we need it
242240266059SGregory Neil Shapirodnl	to avoid errorneous matchs (first rule: D: if there
242306f25ae9SGregory Neil Shapirodnl	is that mark somewhere in the list, it will be taken).
242406f25ae9SGregory Neil Shapirodnl	moreover, we can do some tricks to enforce lookup with
242506f25ae9SGregory Neil Shapirodnl	the tag only, e.g.:
242606f25ae9SGregory Neil Shapiro###	where "exact" is either "+" or "!":
242706f25ae9SGregory Neil Shapiro###	<+ TAG>	lookup with and w/o tag
242806f25ae9SGregory Neil Shapiro###	<! TAG>	lookup with tag
242906f25ae9SGregory Neil Shapirodnl	Warning: + and ! should be in OperatorChars (otherwise there must be
243006f25ae9SGregory Neil Shapirodnl		a blank between them and the tag.
243106f25ae9SGregory Neil Shapiro###	possible values for "mark" are:
243240266059SGregory Neil Shapiro###		D: recursive host lookup (LookUpDomain)
243306f25ae9SGregory Neil Shapirodnl		A: recursive address lookup (LookUpAddress) [not yet required]
243406f25ae9SGregory Neil Shapiro###		E: exact lookup, no modifications
243506f25ae9SGregory Neil Shapiro###		F: full lookup, try user+ext@domain and user@domain
243606f25ae9SGregory Neil Shapiro###		U: user lookup, try user+ext and user (input must have trailing @)
243706f25ae9SGregory Neil Shapiro###	return: <RHS of lookup> or <?> (not found)
243806f25ae9SGregory Neil Shapiro######################################################################
243906f25ae9SGregory Neil Shapiro
244006f25ae9SGregory Neil Shapiro# class with valid marks for SearchList
244106f25ae9SGregory Neil Shapirodnl if A is activated: add it
244240266059SGregory Neil ShapiroC{src}E F D U ifdef(`_FFR_SRCHLIST_A', `A')
244306f25ae9SGregory Neil ShapiroSSearchList
244440266059SGregory Neil Shapiro# just call the ruleset with the name of the tag... nice trick...
244540266059SGregory Neil Shapirodnl       2       3    4
244640266059SGregory Neil ShapiroR<$+> $| <$={src}:$*> <$*>	$: <$1> $| <$4> $| $>$2 <$3> <?> <$1> <>
244740266059SGregory Neil Shapirodnl workspace: <o tag> $| <rest> $| <result of lookup> <>
244840266059SGregory Neil Shapirodnl no match and nothing left: return
244940266059SGregory Neil ShapiroR<$+> $| <> $| <?> <>		$@ <?>
245040266059SGregory Neil Shapirodnl no match but something left: continue
245140266059SGregory Neil ShapiroR<$+> $| <$+> $| <?> <>		$@ $>SearchList <$1> $| <$2>
245240266059SGregory Neil Shapirodnl match: return
245340266059SGregory Neil ShapiroR<$+> $| <$*> $| <$+> <>	$@ <$3>
245406f25ae9SGregory Neil Shapirodnl return result from recursive invocation
245540266059SGregory Neil ShapiroR<$+> $| <$+>			$@ <$2>
245640266059SGregory Neil Shapirodnl endif _ACCESS_TABLE_
245740266059SGregory Neil Shapirodivert(0)
245806f25ae9SGregory Neil Shapiro
245940266059SGregory Neil Shapiro######################################################################
246040266059SGregory Neil Shapiro###  trust_auth: is user trusted to authenticate as someone else?
246140266059SGregory Neil Shapiro###
246240266059SGregory Neil Shapiro###	Parameters:
246340266059SGregory Neil Shapiro###		$1: AUTH= parameter from MAIL command
246440266059SGregory Neil Shapiro######################################################################
246540266059SGregory Neil Shapiro
246640266059SGregory Neil Shapirodnl empty ruleset definition so it can be called
246740266059SGregory Neil ShapiroSLocal_trust_auth
246806f25ae9SGregory Neil ShapiroStrust_auth
246906f25ae9SGregory Neil ShapiroR$*			$: $&{auth_type} $| $1
247006f25ae9SGregory Neil Shapiro# required by RFC 2554 section 4.
247106f25ae9SGregory Neil ShapiroR$@ $| $*		$#error $@ 5.7.1 $: "550 not authenticated"
247206f25ae9SGregory Neil Shapirodnl seems to be useful...
247306f25ae9SGregory Neil ShapiroR$* $| $&{auth_authen}		$@ identical
247406f25ae9SGregory Neil ShapiroR$* $| <$&{auth_authen}>	$@ identical
247506f25ae9SGregory Neil Shapirodnl call user supplied code
2476a7ec597cSGregory Neil ShapiroR$* $| $*		$: $1 $| $>"Local_trust_auth" $2
247706f25ae9SGregory Neil ShapiroR$* $| $#$*		$#$2
247806f25ae9SGregory Neil Shapirodnl default: error
247906f25ae9SGregory Neil ShapiroR$*			$#error $@ 5.7.1 $: "550 " $&{auth_authen} " not allowed to act as " $&{auth_author}
248006f25ae9SGregory Neil Shapiro
248140266059SGregory Neil Shapiro######################################################################
248240266059SGregory Neil Shapiro###  Relay_Auth: allow relaying based on authentication?
248340266059SGregory Neil Shapiro###
248440266059SGregory Neil Shapiro###	Parameters:
248540266059SGregory Neil Shapiro###		$1: ${auth_type}
248640266059SGregory Neil Shapiro######################################################################
248740266059SGregory Neil ShapiroSLocal_Relay_Auth
248806f25ae9SGregory Neil Shapiro
248940266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
249040266059SGregory Neil Shapiro######################################################################
249140266059SGregory Neil Shapiro###  srv_features: which features to offer to a client?
249240266059SGregory Neil Shapiro###	(done in server)
249340266059SGregory Neil Shapiro######################################################################
249440266059SGregory Neil ShapiroSsrv_features
249540266059SGregory Neil Shapiroifdef(`_LOCAL_SRV_FEATURES_', `dnl
249640266059SGregory Neil ShapiroR$*			$: $1 $| $>"Local_srv_features" $1
249740266059SGregory Neil ShapiroR$* $| $#$*		$#$2
249840266059SGregory Neil ShapiroR$* $| $*		$: $1', `dnl')
249940266059SGregory Neil ShapiroR$*		$: $>D <$&{client_name}> <?> <! SRV_FEAT_TAG> <>
250040266059SGregory Neil ShapiroR<?>$*		$: $>A <$&{client_addr}> <?> <! SRV_FEAT_TAG> <>
250140266059SGregory Neil ShapiroR<?>$*		$: <$(access SRV_FEAT_TAG`'_TAG_DELIM_ $: ? $)>
250206f25ae9SGregory Neil ShapiroR<?>$*		$@ OK
250340266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
250440266059SGregory Neil ShapiroR<$* _ATMPF_>$*	$#temp', `dnl')
250540266059SGregory Neil ShapiroR<$+>$*		$# $1
250606f25ae9SGregory Neil Shapiro
250740266059SGregory Neil Shapiro######################################################################
250840266059SGregory Neil Shapiro###  try_tls: try to use STARTTLS?
250940266059SGregory Neil Shapiro###	(done in client)
251040266059SGregory Neil Shapiro######################################################################
251106f25ae9SGregory Neil ShapiroStry_tls
251240266059SGregory Neil Shapiroifdef(`_LOCAL_TRY_TLS_', `dnl
251340266059SGregory Neil ShapiroR$*			$: $1 $| $>"Local_try_tls" $1
251440266059SGregory Neil ShapiroR$* $| $#$*		$#$2
251540266059SGregory Neil ShapiroR$* $| $*		$: $1', `dnl')
251640266059SGregory Neil ShapiroR$*		$: $>D <$&{server_name}> <?> <! TLS_TRY_TAG> <>
251740266059SGregory Neil ShapiroR<?>$*		$: $>A <$&{server_addr}> <?> <! TLS_TRY_TAG> <>
251840266059SGregory Neil ShapiroR<?>$*		$: <$(access TLS_TRY_TAG`'_TAG_DELIM_ $: ? $)>
251906f25ae9SGregory Neil ShapiroR<?>$*		$@ OK
252040266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
252140266059SGregory Neil ShapiroR<$* _ATMPF_>$*	$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
2522193538b7SGregory Neil ShapiroR<NO>$*		$#error $@ 5.7.1 $: "550 do not try TLS with " $&{server_name} " ["$&{server_addr}"]"
252306f25ae9SGregory Neil Shapiro
252440266059SGregory Neil Shapiro######################################################################
252540266059SGregory Neil Shapiro###  tls_rcpt: is connection with server "good" enough?
252640266059SGregory Neil Shapiro###	(done in client, per recipient)
252740266059SGregory Neil Shapirodnl called from deliver() before RCPT command
252840266059SGregory Neil Shapiro###
252940266059SGregory Neil Shapiro###	Parameters:
253040266059SGregory Neil Shapiro###		$1: recipient
253140266059SGregory Neil Shapiro######################################################################
253240266059SGregory Neil ShapiroStls_rcpt
253340266059SGregory Neil Shapiroifdef(`_LOCAL_TLS_RCPT_', `dnl
253440266059SGregory Neil ShapiroR$*			$: $1 $| $>"Local_tls_rcpt" $1
253540266059SGregory Neil ShapiroR$* $| $#$*		$#$2
253640266059SGregory Neil ShapiroR$* $| $*		$: $1', `dnl')
253740266059SGregory Neil Shapirodnl store name of other side
253840266059SGregory Neil ShapiroR$*			$: $(macro {TLS_Name} $@ $&{server_name} $) $1
253940266059SGregory Neil Shapirodnl canonify recipient address
254040266059SGregory Neil ShapiroR$+			$: <?> $>CanonAddr $1
254140266059SGregory Neil Shapirodnl strip trailing dots
254240266059SGregory Neil ShapiroR<?> $+ < @ $+ . >	<?> $1 <@ $2 >
254340266059SGregory Neil Shapirodnl full address?
254440266059SGregory Neil ShapiroR<?> $+ < @ $+ >	$: $1 <@ $2 > $| <F:$1@$2> <U:$1@> <D:$2> <E:>
254540266059SGregory Neil Shapirodnl only localpart?
254640266059SGregory Neil ShapiroR<?> $+			$: $1 $| <U:$1@> <E:>
254740266059SGregory Neil Shapirodnl look it up
254840266059SGregory Neil Shapirodnl also look up a default value via E:
254940266059SGregory Neil ShapiroR$* $| $+	$: $1 $| $>SearchList <! TLS_RCPT_TAG> $| $2 <>
255040266059SGregory Neil Shapirodnl found nothing: stop here
255140266059SGregory Neil ShapiroR$* $| <?>	$@ OK
255240266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
255340266059SGregory Neil ShapiroR$* $| <$* _ATMPF_>	$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
255440266059SGregory Neil Shapirodnl use the generic routine (for now)
255540266059SGregory Neil ShapiroR$* $| <$+>	$@ $>"TLS_connection" $&{verify} $| <$2>')
255640266059SGregory Neil Shapiro
255740266059SGregory Neil Shapiro######################################################################
255840266059SGregory Neil Shapiro###  tls_client: is connection with client "good" enough?
255940266059SGregory Neil Shapiro###	(done in server)
256040266059SGregory Neil Shapiro###
256140266059SGregory Neil Shapiro###	Parameters:
256240266059SGregory Neil Shapiro###		${verify} $| (MAIL|STARTTLS)
256340266059SGregory Neil Shapiro######################################################################
256406f25ae9SGregory Neil Shapirodnl MAIL: called from check_mail
256506f25ae9SGregory Neil Shapirodnl STARTTLS: called from smtp() after STARTTLS has been accepted
256606f25ae9SGregory Neil ShapiroStls_client
256740266059SGregory Neil Shapiroifdef(`_LOCAL_TLS_CLIENT_', `dnl
256840266059SGregory Neil ShapiroR$*			$: $1 $| $>"Local_tls_client" $1
256940266059SGregory Neil ShapiroR$* $| $#$*		$#$2
257040266059SGregory Neil ShapiroR$* $| $*		$: $1', `dnl')
257106f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
257240266059SGregory Neil Shapirodnl store name of other side
257340266059SGregory Neil ShapiroR$*		$: $(macro {TLS_Name} $@ $&{server_name} $) $1
257406f25ae9SGregory Neil Shapirodnl ignore second arg for now
257506f25ae9SGregory Neil Shapirodnl maybe use it to distinguish permanent/temporary error?
257606f25ae9SGregory Neil Shapirodnl if MAIL: permanent (STARTTLS has not been offered)
257706f25ae9SGregory Neil Shapirodnl if STARTTLS: temporary (offered but maybe failed)
257840266059SGregory Neil ShapiroR$* $| $*	$: $1 $| $>D <$&{client_name}> <?> <! TLS_CLT_TAG> <>
257940266059SGregory Neil ShapiroR$* $| <?>$*	$: $1 $| $>A <$&{client_addr}> <?> <! TLS_CLT_TAG> <>
258006f25ae9SGregory Neil Shapirodnl do a default lookup: just TLS_CLT_TAG
258106f25ae9SGregory Neil ShapiroR$* $| <?>$*	$: $1 $| <$(access TLS_CLT_TAG`'_TAG_DELIM_ $: ? $)>
258240266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
258340266059SGregory Neil ShapiroR$* $| <$* _ATMPF_>	$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
258440266059SGregory Neil ShapiroR$*		$@ $>"TLS_connection" $1', `dnl
258540266059SGregory Neil ShapiroR$* $| $*	$@ $>"TLS_connection" $1')
258606f25ae9SGregory Neil Shapiro
258740266059SGregory Neil Shapiro######################################################################
258840266059SGregory Neil Shapiro###  tls_server: is connection with server "good" enough?
258940266059SGregory Neil Shapiro###	(done in client)
259040266059SGregory Neil Shapiro###
259140266059SGregory Neil Shapiro###	Parameter:
259240266059SGregory Neil Shapiro###		${verify}
259340266059SGregory Neil Shapiro######################################################################
259406f25ae9SGregory Neil Shapirodnl i.e. has the server been authenticated and is encryption active?
259506f25ae9SGregory Neil Shapirodnl called from deliver() after STARTTLS command
259606f25ae9SGregory Neil ShapiroStls_server
259740266059SGregory Neil Shapiroifdef(`_LOCAL_TLS_SERVER_', `dnl
259840266059SGregory Neil ShapiroR$*			$: $1 $| $>"Local_tls_server" $1
259940266059SGregory Neil ShapiroR$* $| $#$*		$#$2
260040266059SGregory Neil ShapiroR$* $| $*		$: $1', `dnl')
260106f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
260240266059SGregory Neil Shapirodnl store name of other side
260340266059SGregory Neil ShapiroR$*		$: $(macro {TLS_Name} $@ $&{server_name} $) $1
260440266059SGregory Neil ShapiroR$*		$: $1 $| $>D <$&{server_name}> <?> <! TLS_SRV_TAG> <>
260540266059SGregory Neil ShapiroR$* $| <?>$*	$: $1 $| $>A <$&{server_addr}> <?> <! TLS_SRV_TAG> <>
260606f25ae9SGregory Neil Shapirodnl do a default lookup: just TLS_SRV_TAG
260706f25ae9SGregory Neil ShapiroR$* $| <?>$*	$: $1 $| <$(access TLS_SRV_TAG`'_TAG_DELIM_ $: ? $)>
260840266059SGregory Neil Shapiroifdef(`_ATMPF_', `dnl tempfail?
260940266059SGregory Neil ShapiroR$* $| <$* _ATMPF_>	$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
261040266059SGregory Neil ShapiroR$*		$@ $>"TLS_connection" $1', `dnl
261140266059SGregory Neil ShapiroR$*		$@ $>"TLS_connection" $1')
261206f25ae9SGregory Neil Shapiro
261340266059SGregory Neil Shapiro######################################################################
261440266059SGregory Neil Shapiro###  TLS_connection: is TLS connection "good" enough?
261540266059SGregory Neil Shapiro###
261640266059SGregory Neil Shapiro###	Parameters:
261706f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
261840266059SGregory Neil Shapiro###		${verify} $| <Requirement> [<>]', `dnl
261940266059SGregory Neil Shapiro###		${verify}')
262040266059SGregory Neil Shapiro###		Requirement: RHS from access map, may be ? for none.
262140266059SGregory Neil Shapirodnl	syntax for Requirement:
262240266059SGregory Neil Shapirodnl	[(PERM|TEMP)+] (VERIFY[:bits]|ENCR:bits) [+extensions]
262340266059SGregory Neil Shapirodnl	extensions: could be a list of further requirements
262440266059SGregory Neil Shapirodnl		for now: CN:string	{cn_subject} == string
262540266059SGregory Neil Shapiro######################################################################
262640266059SGregory Neil ShapiroSTLS_connection
262740266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl', `dnl use default error
262840266059SGregory Neil Shapirodnl deal with TLS handshake failures: abort
262940266059SGregory Neil ShapiroRSOFTWARE	$#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') TLS handshake."
263040266059SGregory Neil Shapirodivert(-1)')
263106f25ae9SGregory Neil Shapirodnl common ruleset for tls_{client|server}
263240266059SGregory Neil Shapirodnl input: ${verify} $| <ResultOfLookup> [<>]
263306f25ae9SGregory Neil Shapirodnl remove optional <>
263406f25ae9SGregory Neil ShapiroR$* $| <$*>$*			$: $1 $| <$2>
263540266059SGregory Neil Shapirodnl workspace: ${verify} $| <ResultOfLookup>
263640266059SGregory Neil Shapiro# create the appropriate error codes
263706f25ae9SGregory Neil Shapirodnl permanent or temporary error?
263806f25ae9SGregory Neil ShapiroR$* $| <PERM + $={tls} $*>	$: $1 $| <503:5.7.0> <$2 $3>
263906f25ae9SGregory Neil ShapiroR$* $| <TEMP + $={tls} $*>	$: $1 $| <403:4.7.0> <$2 $3>
264006f25ae9SGregory Neil Shapirodnl default case depends on TLS_PERM_ERR
264106f25ae9SGregory Neil ShapiroR$* $| <$={tls} $*>		$: $1 $| <ifdef(`TLS_PERM_ERR', `503:5.7.0', `403:4.7.0')> <$2 $3>
264240266059SGregory Neil Shapirodnl workspace: ${verify} $| [<SMTP:ESC>] <ResultOfLookup>
264340266059SGregory Neil Shapiro# deal with TLS handshake failures: abort
264406f25ae9SGregory Neil ShapiroRSOFTWARE $| <$-:$+> $* 	$#error $@ $2 $: $1 " TLS handshake failed."
264506f25ae9SGregory Neil Shapirodnl no <reply:dns> i.e. not requirements in the access map
264606f25ae9SGregory Neil Shapirodnl use default error
264706f25ae9SGregory Neil ShapiroRSOFTWARE $| $* 		$#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') TLS handshake failed."
264840266059SGregory Neil ShapiroR$* $| <$*> <VERIFY>		$: <$2> <VERIFY> <> $1
264940266059SGregory Neil Shapirodnl separate optional requirements
265040266059SGregory Neil ShapiroR$* $| <$*> <VERIFY + $+>	$: <$2> <VERIFY> <$3> $1
265140266059SGregory Neil ShapiroR$* $| <$*> <$={tls}:$->$*	$: <$2> <$3:$4> <> $1
265240266059SGregory Neil Shapirodnl separate optional requirements
265340266059SGregory Neil ShapiroR$* $| <$*> <$={tls}:$- + $+>$*	$: <$2> <$3:$4> <$5> $1
265406f25ae9SGregory Neil Shapirodnl some other value in access map: accept
265506f25ae9SGregory Neil Shapirodnl this also allows to override the default case (if used)
265606f25ae9SGregory Neil ShapiroR$* $| $*			$@ OK
265706f25ae9SGregory Neil Shapiro# authentication required: give appropriate error
265806f25ae9SGregory Neil Shapiro# other side did authenticate (via STARTTLS)
265940266059SGregory Neil Shapirodnl workspace: <SMTP:ESC> <{VERIFY,ENCR}[:BITS]> <[extensions]> ${verify}
266006f25ae9SGregory Neil Shapirodnl only verification required and it succeeded
266140266059SGregory Neil ShapiroR<$*><VERIFY> <> OK		$@ OK
266240266059SGregory Neil Shapirodnl verification required and it succeeded but extensions are given
266340266059SGregory Neil Shapirodnl change it to <SMTP:ESC> <REQ:0>  <extensions>
266440266059SGregory Neil ShapiroR<$*><VERIFY> <$+> OK		$: <$1> <REQ:0> <$2>
266506f25ae9SGregory Neil Shapirodnl verification required + some level of encryption
266640266059SGregory Neil ShapiroR<$*><VERIFY:$-> <$*> OK	$: <$1> <REQ:$2> <$3>
266706f25ae9SGregory Neil Shapirodnl just some level of encryption required
266840266059SGregory Neil ShapiroR<$*><ENCR:$-> <$*> $*		$: <$1> <REQ:$2> <$3>
266940266059SGregory Neil Shapirodnl workspace:
267040266059SGregory Neil Shapirodnl 1. <SMTP:ESC> <VERIFY [:bits]>  <[extensions]> {verify} (!= OK)
267140266059SGregory Neil Shapirodnl 2. <SMTP:ESC> <REQ:bits>  <[extensions]>
267240266059SGregory Neil Shapirodnl verification required but ${verify} is not set (case 1.)
267340266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*>	$#error $@ $2 $: $1 " authentication required"
267440266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> FAIL	$#error $@ $2 $: $1 " authentication failed"
267540266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> NO	$#error $@ $2 $: $1 " not authenticated"
267640266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> NOT	$#error $@ $2 $: $1 " no authentication requested"
267740266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> NONE	$#error $@ $2 $: $1 " other side does not support STARTTLS"
267806f25ae9SGregory Neil Shapirodnl some other value for ${verify}
267940266059SGregory Neil ShapiroR<$-:$+><VERIFY $*> <$*> $+	$#error $@ $2 $: $1 " authentication failure " $4
268040266059SGregory Neil Shapirodnl some level of encryption required: get the maximum level (case 2.)
268140266059SGregory Neil ShapiroR<$*><REQ:$-> <$*>		$: <$1> <REQ:$2> <$3> $>max $&{cipher_bits} : $&{auth_ssf}
268206f25ae9SGregory Neil Shapirodnl compare required bits with actual bits
268340266059SGregory Neil ShapiroR<$*><REQ:$-> <$*> $-		$: <$1> <$2:$4> <$3> $(arith l $@ $4 $@ $2 $)
268440266059SGregory Neil ShapiroR<$-:$+><$-:$-> <$*> TRUE	$#error $@ $2 $: $1 " encryption too weak " $4 " less than " $3
268540266059SGregory Neil Shapirodnl strength requirements fulfilled
268640266059SGregory Neil Shapirodnl TLS Additional Requirements Separator
268740266059SGregory Neil Shapirodnl this should be something which does not appear in the extensions itself
268840266059SGregory Neil Shapirodnl @ could be part of a CN, DN, etc...
268940266059SGregory Neil Shapirodnl use < > ? those are encoded in CN, DN, ...
269040266059SGregory Neil Shapirodefine(`_TLS_ARS_', `++')dnl
269140266059SGregory Neil Shapirodnl workspace:
269240266059SGregory Neil Shapirodnl <SMTP:ESC> <REQ:bits> <extensions> result-of-compare
269340266059SGregory Neil ShapiroR<$-:$+><$-:$-> <$*> $*		$: <$1:$2 _TLS_ARS_ $5>
269440266059SGregory Neil Shapirodnl workspace: <SMTP:ESC _TLS_ARS_ extensions>
269540266059SGregory Neil Shapirodnl continue: check  extensions
269640266059SGregory Neil ShapiroR<$-:$+ _TLS_ARS_ >			$@ OK
269740266059SGregory Neil Shapirodnl split extensions into own list
269840266059SGregory Neil ShapiroR<$-:$+ _TLS_ARS_ $+ >			$: <$1:$2> <$3>
269940266059SGregory Neil ShapiroR<$-:$+> < $+ _TLS_ARS_ $+ >		<$1:$2> <$3> <$4>
270040266059SGregory Neil ShapiroR<$-:$+> $+			$@ $>"TLS_req" $3 $| <$1:$2>
270106f25ae9SGregory Neil Shapiro
270240266059SGregory Neil Shapiro######################################################################
270340266059SGregory Neil Shapiro###  TLS_req: check additional TLS requirements
270440266059SGregory Neil Shapiro###
270540266059SGregory Neil Shapiro###	Parameters: [<list> <of> <req>] $| <$-:$+>
270640266059SGregory Neil Shapiro###		$-: SMTP reply code
270740266059SGregory Neil Shapiro###		$+: Enhanced Status Code
270840266059SGregory Neil Shapirodnl  further requirements for this ruleset:
270940266059SGregory Neil Shapirodnl	name of "other side" is stored is {TLS_name} (client/server_name)
271040266059SGregory Neil Shapirodnl
271140266059SGregory Neil Shapirodnl	currently only CN[:common_name] is implemented
271240266059SGregory Neil Shapirodnl	right now this is only a logical AND
271340266059SGregory Neil Shapirodnl	i.e. all requirements must be true
271440266059SGregory Neil Shapirodnl	how about an OR? CN must be X or CN must be Y or ..
271540266059SGregory Neil Shapirodnl	use a macro to compute this as a trivial sequential
271640266059SGregory Neil Shapirodnl	operations (no precedences etc)?
271740266059SGregory Neil Shapiro######################################################################
271840266059SGregory Neil ShapiroSTLS_req
271940266059SGregory Neil Shapirodnl no additional requirements: ok
272040266059SGregory Neil ShapiroR $| $+		$@ OK
272140266059SGregory Neil Shapirodnl require CN: but no CN specified: use name of other side
272240266059SGregory Neil ShapiroR<CN> $* $| <$+>		$: <CN:$&{TLS_Name}> $1 $| <$2>
272340266059SGregory Neil Shapirodnl match, check rest
272440266059SGregory Neil ShapiroR<CN:$&{cn_subject}> $* $| <$+>		$@ $>"TLS_req" $1 $| <$2>
272540266059SGregory Neil Shapirodnl CN does not match
272640266059SGregory Neil Shapirodnl  1   2      3  4
272740266059SGregory Neil ShapiroR<CN:$+> $* $| <$-:$+>	$#error $@ $4 $: $3 " CN " $&{cn_subject} " does not match " $1
272840266059SGregory Neil Shapirodnl cert subject
272940266059SGregory Neil ShapiroR<CS:$&{cert_subject}> $* $| <$+>	$@ $>"TLS_req" $1 $| <$2>
273040266059SGregory Neil Shapirodnl CS does not match
273140266059SGregory Neil Shapirodnl  1   2      3  4
273213bd1963SGregory Neil ShapiroR<CS:$+> $* $| <$-:$+>	$#error $@ $4 $: $3 " Cert Subject " $&{cert_subject} " does not match " $1
273340266059SGregory Neil Shapirodnl match, check rest
273440266059SGregory Neil ShapiroR<CI:$&{cert_issuer}> $* $| <$+>	$@ $>"TLS_req" $1 $| <$2>
273540266059SGregory Neil Shapirodnl CI does not match
273640266059SGregory Neil Shapirodnl  1   2      3  4
273713bd1963SGregory Neil ShapiroR<CI:$+> $* $| <$-:$+>	$#error $@ $4 $: $3 " Cert Issuer " $&{cert_issuer} " does not match " $1
273840266059SGregory Neil Shapirodnl return from recursive call
273940266059SGregory Neil ShapiroROK			$@ OK
274040266059SGregory Neil Shapiro
274140266059SGregory Neil Shapiro######################################################################
274240266059SGregory Neil Shapiro###  max: return the maximum of two values separated by :
274340266059SGregory Neil Shapiro###
274440266059SGregory Neil Shapiro###	Parameters: [$-]:[$-]
274540266059SGregory Neil Shapiro######################################################################
274606f25ae9SGregory Neil ShapiroSmax
274706f25ae9SGregory Neil ShapiroR:		$: 0
274806f25ae9SGregory Neil ShapiroR:$-		$: $1
274906f25ae9SGregory Neil ShapiroR$-:		$: $1
275006f25ae9SGregory Neil ShapiroR$-:$-		$: $(arith l $@ $1 $@ $2 $) : $1 : $2
275106f25ae9SGregory Neil ShapiroRTRUE:$-:$-	$: $2
275240266059SGregory Neil ShapiroR$-:$-:$-	$: $2
275340266059SGregory Neil Shapirodnl endif _ACCESS_TABLE_
275440266059SGregory Neil Shapirodivert(0)
275506f25ae9SGregory Neil Shapiro
275640266059SGregory Neil Shapiro######################################################################
275740266059SGregory Neil Shapiro###  RelayTLS: allow relaying based on TLS authentication
275840266059SGregory Neil Shapiro###
275940266059SGregory Neil Shapiro###	Parameters:
276040266059SGregory Neil Shapiro###		none
276140266059SGregory Neil Shapiro######################################################################
276240266059SGregory Neil ShapiroSRelayTLS
276306f25ae9SGregory Neil Shapiro# authenticated?
276406f25ae9SGregory Neil Shapirodnl we do not allow relaying for anyone who can present a cert
276506f25ae9SGregory Neil Shapirodnl signed by a "trusted" CA. For example, even if we put verisigns
276613bd1963SGregory Neil Shapirodnl CA in CertPath so we can authenticate users, we do not allow
276706f25ae9SGregory Neil Shapirodnl them to abuse our server (they might be easier to get hold of,
276806f25ae9SGregory Neil Shapirodnl but anyway).
276906f25ae9SGregory Neil Shapirodnl so here is the trick: if the verification succeeded
277006f25ae9SGregory Neil Shapirodnl we look up the cert issuer in the access map
277106f25ae9SGregory Neil Shapirodnl (maybe after extracting a part with a regular expression)
277206f25ae9SGregory Neil Shapirodnl if this returns RELAY we relay without further questions
277306f25ae9SGregory Neil Shapirodnl if it returns SUBJECT we perform a similar check on the
277406f25ae9SGregory Neil Shapirodnl cert subject.
277506f25ae9SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
277640266059SGregory Neil ShapiroR$*			$: <?> $&{verify}
277740266059SGregory Neil ShapiroR<?> OK			$: OK		authenticated: continue
277840266059SGregory Neil ShapiroR<?> $*			$@ NO		not authenticated
277906f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_ISSUER_', `dnl
278040266059SGregory Neil ShapiroR$*			$: $(CERTIssuer $&{cert_issuer} $)',
278140266059SGregory Neil Shapiro`R$*			$: $&{cert_issuer}')
278240266059SGregory Neil ShapiroR$+			$: $(access CERTISSUER`'_TAG_DELIM_`'$1 $)
278306f25ae9SGregory Neil Shapirodnl use $# to stop further checks (delay_check)
278440266059SGregory Neil ShapiroRRELAY			$# RELAY
278506f25ae9SGregory Neil Shapiroifdef(`_CERT_REGEX_SUBJECT_', `dnl
278640266059SGregory Neil ShapiroRSUBJECT		$: <@> $(CERTSubject $&{cert_subject} $)',
278740266059SGregory Neil Shapiro`RSUBJECT		$: <@> $&{cert_subject}')
278840266059SGregory Neil ShapiroR<@> $+			$: <@> $(access CERTSUBJECT`'_TAG_DELIM_`'$1 $)
278940266059SGregory Neil ShapiroR<@> RELAY		$# RELAY
279040266059SGregory Neil ShapiroR$*			$: NO', `dnl')
279140266059SGregory Neil Shapiro
279240266059SGregory Neil Shapiro######################################################################
279340266059SGregory Neil Shapiro###  authinfo: lookup authinfo in the access map
279440266059SGregory Neil Shapiro###
279540266059SGregory Neil Shapiro###	Parameters:
279640266059SGregory Neil Shapiro###		$1: {server_name}
279740266059SGregory Neil Shapiro###		$2: {server_addr}
279840266059SGregory Neil Shapirodnl	both are currently ignored
279940266059SGregory Neil Shapirodnl if it should be done via another map, we either need to restrict
280040266059SGregory Neil Shapirodnl functionality (it calls D and A) or copy those rulesets (or add another
280140266059SGregory Neil Shapirodnl parameter which I want to avoid, it's quite complex already)
280240266059SGregory Neil Shapiro######################################################################
280340266059SGregory Neil Shapirodnl omit this ruleset if neither is defined?
280440266059SGregory Neil Shapirodnl it causes DefaultAuthInfo to be ignored
280540266059SGregory Neil Shapirodnl (which may be considered a good thing).
280640266059SGregory Neil ShapiroSauthinfo
280740266059SGregory Neil Shapiroifdef(`_AUTHINFO_TABLE_', `dnl
280840266059SGregory Neil ShapiroR$*		$: <$(authinfo AuthInfo:$&{server_name} $: ? $)>
280940266059SGregory Neil ShapiroR<?>		$: <$(authinfo AuthInfo:$&{server_addr} $: ? $)>
281040266059SGregory Neil ShapiroR<?>		$: <$(authinfo AuthInfo: $: ? $)>
281140266059SGregory Neil ShapiroR<?>		$@ no				no authinfo available
281240266059SGregory Neil ShapiroR<$*>		$# $1
281340266059SGregory Neil Shapirodnl', `dnl
281440266059SGregory Neil Shapiroifdef(`_ACCESS_TABLE_', `dnl
281540266059SGregory Neil ShapiroR$*		$: $1 $| $>D <$&{server_name}> <?> <! AuthInfo> <>
281640266059SGregory Neil ShapiroR$* $| <?>$*	$: $1 $| $>A <$&{server_addr}> <?> <! AuthInfo> <>
281740266059SGregory Neil ShapiroR$* $| <?>$*	$: $1 $| <$(access AuthInfo`'_TAG_DELIM_ $: ? $)> <>
281840266059SGregory Neil ShapiroR$* $| <?>$*	$@ no				no authinfo available
281940266059SGregory Neil ShapiroR$* $| <$*> <>	$# $2
282040266059SGregory Neil Shapirodnl', `dnl')')
282106f25ae9SGregory Neil Shapiro
282206f25ae9SGregory Neil Shapiroundivert(9)dnl LOCAL_RULESETS
282306f25ae9SGregory Neil Shapiro#
282406f25ae9SGregory Neil Shapiro######################################################################
282506f25ae9SGregory Neil Shapiro######################################################################
282606f25ae9SGregory Neil Shapiro#####
282706f25ae9SGregory Neil Shapiro`#####			MAIL FILTER DEFINITIONS'
282806f25ae9SGregory Neil Shapiro#####
282906f25ae9SGregory Neil Shapiro######################################################################
283006f25ae9SGregory Neil Shapiro######################################################################
283140266059SGregory Neil Shapiro_MAIL_FILTERS_
2832c2aa98e2SPeter Wemm#
2833c2aa98e2SPeter Wemm######################################################################
2834c2aa98e2SPeter Wemm######################################################################
2835c2aa98e2SPeter Wemm#####
2836c2aa98e2SPeter Wemm`#####			MAILER DEFINITIONS'
2837c2aa98e2SPeter Wemm#####
2838c2aa98e2SPeter Wemm######################################################################
2839c2aa98e2SPeter Wemm######################################################################
284006f25ae9SGregory Neil Shapiroundivert(7)dnl MAILER_DEFINITIONS
284142e5d165SGregory Neil Shapiro
2842