#
# specialfrom: generate rules to apply special address for specific users
#
# (this file must be included after "acceptaddr")

REVISION_ID='@(#)specialfrom	3.16 (motonori/WIDE) 19 Jul 1998'

#|# special address
#|##SPECIAL_FROM='special.address'
#|# <<CONFIGURATIONS AS A SENDER>>
#|# special users who should use the special address
#|##SPECIAL_USERS='user1 user2 ...'
#|##SPECIAL_USERS='/etc/sendmail.specialusers'
#|##SPECIAL_USER_HEAD='pre1 pre2 ...'
#|##SPECIAL_USER_TAIL='post1 post2 ...'
#|# perform special address rewriting (yes/no)
#|#SPECIAL_FROM_REWRITE=no
#|# <<CONFIGURATIONS AS A RECIPIENT>>
#|# special users who should use the special address
#|##SPECIAL_ACCEPTABLE_USERS='user1 user2 ...'
#|##SPECIAL_ACCEPTABLE_USERS='/etc/sendmail.specialaccept'
#|##SPECIAL_ACCEPTABLE_USER_HEAD='pre1 pre2 ...'
#|##SPECIAL_ACCEPTABLE_USER_TAIL='post1 post2 ...'
#|# make "User Unknown" error for users not listed in SPECIAL_ACCEPTABL (yes/no)
#|#ERROR_NOT_ACCEPTABLE_USERS=no

if [ "$SPECIAL_FROM" ]
then

	if [ "$REVISION_ID_LIST" ]
	then
		REVISION_ID_LIST="$REVISION_ID_LIST\\
# $REVISION_ID"
	else
		REVISION_ID_LIST="# $REVISION_ID"
	fi

	# allocate a macro character
	_ALLOC_MODE=normal
	_ALLOC_TYPE=macro
	_ALLOC_DIR=down
	_ALLOC_PREF=Q
	_ALLOC_USAGE='special address [specialfrom]'
	. $MASTERDIR/$CHARALLOC
	_SA_CHAR=$_ALLOC_CHAR

HDRSPECIALFROM="\\
# special address\\
D$_SA_CHAR$SPECIAL_FROM"

	CLASS=
	if [ "$SPECIAL_USERS" ]
	then

		# allocate a class character
		_ALLOC_MODE=normal
		_ALLOC_TYPE=class
		_ALLOC_DIR=down
		_ALLOC_PREF=Q
		_ALLOC_USAGE='special senders [specialfrom]'
		. $MASTERDIR/$CHARALLOC
		_QU_CHAR=$_ALLOC_CHAR

		case "$SPECIAL_USERS" in
		/*|-*)	# file definition
			CLASS="# special senders\\
F$_QU_CHAR$SPECIAL_USERS" ;;
		"") ;;
		*)	# definition in .cf
			CLASS="# special senders\\
C$_QU_CHAR $SPECIAL_USERS" ;;
		esac

#		if [ "$CLASS" = "" ]
#		then
#			CLASS='#C'$_QU_CHAR' specialusers'
#		fi

	fi

	if [ "$SPECIAL_USER_HEAD" ]
	then

		# allocate a class character
		_ALLOC_MODE=normal
		_ALLOC_TYPE=class
		_ALLOC_DIR=down
		_ALLOC_PREF=Q
		_ALLOC_USAGE='special sender head [specialfrom]'
		. $MASTERDIR/$CHARALLOC
		_QH_CHAR=$_ALLOC_CHAR

		case "$SPECIAL_USER_HEAD" in
		/*|-*)	# file definition
			CLASS="$CLASS\\
# special sender head\\
F$_QH_CHAR$SPECIAL_USER_HEAD" ;;
		"") ;;
		*)	# definition in .cf
			CLASS="$CLASS\\
# special sender head\\
C$_QH_CHAR$SPECIAL_USER_HEAD" ;;
		esac

	fi

	if [ "$SPECIAL_USER_TAIL" ]
	then

		# allocate a class character
		_ALLOC_MODE=normal
		_ALLOC_TYPE=class
		_ALLOC_DIR=down
		_ALLOC_PREF=Q
		_ALLOC_USAGE='special sender tail [specialfrom]'
		. $MASTERDIR/$CHARALLOC
		_QT_CHAR=$_ALLOC_CHAR

		case "$SPECIAL_USER_TAIL" in
		/*|-*)	# file definition
			CLASS="$CLASS\\
# special sender head\\
F$_QT_CHAR$SPECIAL_USER_TAIL" ;;
		"") ;;
		*)	# definition in .cf
			CLASS="$CLASS\\
# special sender head\\
C$_QT_CHAR$SPECIAL_USER_TAIL" ;;
		esac

	fi

	if [ "$CLASS" ]
	then

HDRSPECIALFROM="$HDRSPECIALFROM\\
# users to use special address\\
$CLASS"

	fi

	CLASS=
	if [ "$SPECIAL_ACCEPTABLE_USERS" ]
	then

		# allocate a class character
		_ALLOC_MODE=normal
		_ALLOC_TYPE=class
		_ALLOC_DIR=down
		_ALLOC_PREF=Q
		_ALLOC_USAGE='special acceptable users [specialfrom]'
		. $MASTERDIR/$CHARALLOC
		_YU_CHAR=$_ALLOC_CHAR

		case "$SPECIAL_ACCEPTABLE_USERS" in
		/*|-*)	# file definition
			CLASS="# special acceptable users\\
F$_YU_CHAR$SPECIAL_ACCEPTABLE_USERS" ;;
		"") ;;
		*)	# definition in .cf
			CLASS="# special acceptable users\\
C$_YU_CHAR $SPECIAL_ACCEPTABLE_USERS" ;;
		esac

#		if [ "$CLASS" = "" ]
#		then
#			CLASS='#C'$_YU_CHAR' specialusers'
#		fi

	fi

	if [ "$SPECIAL_ACCEPTABLE_USER_HEAD" ]
	then

		# allocate a class character
		_ALLOC_MODE=normal
		_ALLOC_TYPE=class
		_ALLOC_DIR=down
		_ALLOC_PREF=Q
		_ALLOC_USAGE='special acceptable user head [specialfrom]'
		. $MASTERDIR/$CHARALLOC
		_YH_CHAR=$_ALLOC_CHAR

		case "$SPECIAL_ACCEPTABLE_USER_HEAD" in
		/*|-*)	# file definition
			CLASS="$CLASS\\
# special acceptable user head\\
F$_YH_CHAR$SPECIAL_ACCEPTABLE_USER_HEAD" ;;
		"") ;;
		*)	# definition in .cf
			CLASS="$CLASS\\
# special acceptable user head\\
C$_YH_CHAR$SPECIAL_ACCEPTABLE_USER_HEAD" ;;
		esac

	fi

	if [ "$SPECIAL_ACCEPTABLE_USER_TAIL" ]
	then

		# allocate a class character
		_ALLOC_MODE=normal
		_ALLOC_TYPE=class
		_ALLOC_DIR=down
		_ALLOC_PREF=Q
		_ALLOC_USAGE='special acceptable user tail [specialfrom]'
		. $MASTERDIR/$CHARALLOC
		_YT_CHAR=$_ALLOC_CHAR

		case "$SPECIAL_ACCEPTABLE_USER_TAIL" in
		/*|-*)	# file definition
			CLASS="$CLASS\\
# special acceptable user head\\
F$_YT_CHAR$SPECIAL_ACCEPTABLE_USER_TAIL" ;;
		"") ;;
		*)	# definition in .cf
			CLASS="$CLASS\\
# special acceptable user head\\
C$_YT_CHAR$SPECIAL_ACCEPTABLE_USER_TAIL" ;;
		esac

	fi

	if [ "$CLASS" ]
	then

HDRSPECIALFROM="$HDRSPECIALFROM\\
# users to be accepted with special address\\
$CLASS"

	fi

S11SPECIALFROM=
S21SPECIALFROM=

	if [ "$_QU_CHAR" ]
	then

S11SPECIALFROM="$S11SPECIALFROM"'\
R$='$_QU_CHAR'			$@$1<@$'$_SA_CHAR'>			special users'
S21SPECIALFROM="$S21SPECIALFROM"'\
R$='$_QU_CHAR'			$@$1<@$'$_SA_CHAR'>			special users'

	fi

	if [ "$_QH_CHAR" ]
	then

S11SPECIALFROM="$S11SPECIALFROM"'\
R$='$_QH_CHAR'$+			$@$1$2<@$'$_SA_CHAR'>			special user head'
S21SPECIALFROM="$S21SPECIALFROM"'\
R$='$_QH_CHAR'$+			$@$1$2<@$'$_SA_CHAR'>			special user head'

	fi

	if [ "$_QT_CHAR" ]
	then

S11SPECIALFROM="$S11SPECIALFROM"'\
R$+$='$_QT_CHAR'			$@$1$2<@$'$_SA_CHAR'>			special user tail'
S21SPECIALFROM="$S21SPECIALFROM"'\
R$+$='$_QT_CHAR'			$@$1$2<@$'$_SA_CHAR'>			special user tail'

	fi

	: ${SPECIAL_FROM_REWRITE=no}
	if [ "$SPECIAL_FROM_REWRITE" != no ]
	then

		S11SPECIALREWRITE=
		S21SPECIALREWRITE=

		if [ "$_AA_CHAR" ]
		then

			if [ "$_QU_CHAR" ]
			then

S11SPECIALREWRITE="$S11SPECIALREWRITE"'\
R$='$_QU_CHAR'<@$=w>		$@$1<@$'$_SA_CHAR'>			rewrite to special addr\
R$='$_QU_CHAR'<@$='$_AA_CHAR'>		$@$1<@$'$_SA_CHAR'>'
S21SPECIALREWRITE="$S21SPECIALREWRITE"'\
R$='$_QU_CHAR'<@$=w>		$@$1<@$'$_SA_CHAR'>			rewrite to special addr\
R$='$_QU_CHAR'<@$='$_AA_CHAR'>		$@$1<@$'$_SA_CHAR'>'

			fi

			if [ "$_QH_CHAR" ]
			then

S11SPECIALREWRITE="$S11SPECIALREWRITE"'\
R$='$_QH_CHAR'$+<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr\
R$='$_QH_CHAR'$+<@$='$_AA_CHAR'>		$@$1$2<@$'$_SA_CHAR'>'
S21SPECIALREWRITE="$S21SPECIALREWRITE"'\
R$='$_QH_CHAR'$+<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr\
R$='$_QH_CHAR'$+<@$='$_AA_CHAR'>		$@$1$2<@$'$_SA_CHAR'>'

			fi

			if [ "$_QT_CHAR" ]
			then

S11SPECIALREWRITE="$S11SPECIALREWRITE"'\
R$+$='$_QT_CHAR'<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr\
R$+$='$_QT_CHAR'<@$='$_AA_CHAR'>		$@$1$2<@$'$_SA_CHAR'>'
S21SPECIALREWRITE="$S21SPECIALREWRITE"'\
R$+$='$_QT_CHAR'<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr\
R$+$='$_QT_CHAR'<@$='$_AA_CHAR'>		$@$1$2<@$'$_SA_CHAR'>'

			fi

		else

			if [ "$_QU_CHAR" ]
			then

S11SPECIALREWRITE="$S11SPECIALREWRITE"'\
R$='$_QU_CHAR'<@$=w>		$@$1<@$'$_SA_CHAR'>			rewrite to special addr'
S21SPECIALREWRITE="$S21SPECIALREWRITE"'\
R$='$_QU_CHAR'<@$=w>		$@$1<@$'$_SA_CHAR'>			rewrite to special addr'

			fi

			if [ "$_QH_CHAR" ]
			then

S11SPECIALREWRITE="$S11SPECIALREWRITE"'\
R$='$_QH_CHAR'$+<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr'
S21SPECIALREWRITE="$S21SPECIALREWRITE"'\
R$='$_QH_CHAR'$+<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr'

			fi

			if [ "$_QT_CHAR" ]
			then

S11SPECIALREWRITE="$S11SPECIALREWRITE"'\
R$+$='$_QT_CHAR'<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr'
S21SPECIALREWRITE="$S21SPECIALREWRITE"'\
R$+$='$_QT_CHAR'<@$=w>		$@$1$2<@$'$_SA_CHAR'>			rewrite to special addr'

			fi

		fi

	fi

SPECIALFROMRULE=

	if [ "$_YU_CHAR" ]
	then

SPECIALFROMRULE="$SPECIALFROMRULE"'\
# special domain to be recognized as local\
R$='$_YU_CHAR'<@$'$_SA_CHAR'>		$1'

	fi

	if [ "$_YH_CHAR" ]
	then

SPECIALFROMRULE="$SPECIALFROMRULE"'\
# special domain to be recognized as local\
R$='$_YH_CHAR'$+<@$'$_SA_CHAR'>		$1$2'

	fi

	if [ "$_YT_CHAR" ]
	then

SPECIALFROMRULE="$SPECIALFROMRULE"'\
# special domain to be recognized as local\
R$+$='$_YT_CHAR'<@$'$_SA_CHAR'>		$1$2'

	fi

	: ${ERROR_NOT_ACCEPTABLE_USERS=no}
	if [ "$ERROR_NOT_ACCEPTABLE_USERS" != no ]
	then

		case "$CF_FORMAT" in
		V1|NMTC)

SPECIALFROMRULE="$SPECIALFROMRULE"'\
# special domain to be recognized as local\
R$*<@$'$_SA_CHAR'>		$#error$: User Unknown'
			;;

		V5)

SPECIALFROMRULE="$SPECIALFROMRULE"'\
# special domain to be recognized as local\
R$*<@$'$_SA_CHAR'>		$#error$@NOUSER$: 550 User Unknown'
			;;

		*)

SPECIALFROMRULE="$SPECIALFROMRULE"'\
# special domain to be recognized as local\
R$*<@$'$_SA_CHAR'>		$#error$@5.1.1$: User Unknown'
			;;

		esac

	fi

fi
