#! /bin/sh ## $Revision: 1.7 $ ## Initial parsing of control messages. ## =()<. @<_PATH_SHELLVARS>@>()= . /news/lib/innshellvars WRITELOG=${NEWSBIN}/writelog AZ=ABCDEFGHIJKLMNOPQRSTUVWXYZ az=abcdefghijklmnopqrstuvwxyz ZN=0123456789 # Attempt to sanitize the address FROM="`echo \"$1\" | tr ${AZ} ${az} | tr -dc \\\055${az}${ZN}+_.@%`" REPLYTO="`echo \"$2\" | tr ${AZ} ${az} | tr -dc \\\055${az}${ZN}+_.@%`" case "$3" in "") ARTICLE=/dev/null ;; /*) ARTICLE="$3" ;; *) ARTICLE="${SPOOL}/$3" ;; esac PATHHOST="$4" # Catch an address left with a leading '-' case "X$FROM" in X-*) if $MAILFAILURES; then ${SED} -e 's/^~/~~/' < ${ARTICLE} \ | ${MAILCMD} -s "Bad FROM address" ${NEWSMASTER} fi cat ${ARTICLE} | writelog $MOST_LOGS/badcontrol.log "`date` Bad FROM address" exit ;; esac case "X$REPLYTO" in X-*) if $MAILFAILURES; then ${SED} -e 's/^~/~~/' < ${ARTICLE} \ | ${MAILCMD} -s "Bad REPLY-TO address" ${NEWSMASTER} fi cat ${ARTICLE} | writelog $MOST_LOGS/badcontrol.log "`date` Bad REPLY-TO address" exit ;; esac umask 002 TEMP=${TMPDIR}/ctl$$ ## Avoid egrep bugs with empty or-patterns. test -z "${PROG}" && PROG=all ${EGREP} "^(${PROG}|all):" <${CTLFILE} >${TEMP} ## Get any arguments. if grep "^Control:[ ]*${PROG}" <${ARTICLE} >/dev/null 2>&1 ; then set X `${SED} -n -e "s/^Control:[ ]*${PROG}//p" -e '/^$/q' <${ARTICLE}` shift else if grep "^Subject:[ ]*cmsg[ ]*${PROG}" \ <${ARTICLE} >/dev/null 2>&1 ; then set X `${SED} -n -e "s/^Subject:[ ]*cmsg[ ]*${PROG}//p" \ -e '/^$/q' <${ARTICLE}` shift else rm -f ${TEMP} ${SED} -e 's/^~/~~/' < ${ARTICLE} \ | ${MAILCMD} -s "Bad header by ${FROM}" ${NEWSMASTER} exit fi fi # Check characters in values of variables that will be inside an eval TRANS1="`echo \"$1\" | tr ${AZ} ${az} | tr -dc \\\055${az}${ZN}+_.`" if [ ${1}X != ${TRANS1}X ]; then rm -f ${TEMP} ${SED} -e 's/^~/~~/' < ${ARTICLE} \ | ${MAILCMD} -s "Malformed newsgroup name by ${FROM}" ${NEWSMASTER} exit fi TRANSP="`echo \"$PROG\" | tr ${AZ} ${az} | tr -dc \\\055${az}${ZN}+_.`" if [ ${PROG}X != ${TRANSP}X ]; then rm -f ${TEMP} ${SED} -e 's/^~/~~/' < ${ARTICLE} \ | ${MAILCMD} -s "Unexpected program name by ${FROM}" ${NEWSMASTER} exit fi ACTION=mail IFS=: exec <${TEMP} while read MESSAGE FROM_PAT NG_PAT ACT_PAT ; do eval "case \"${FROM}\" in ${FROM_PAT}) ## Got a match -- if newgroup/rmgroup, must also ## match the newsgroup pattern. case \"${PROG}\" in newgroup|rmgroup) case \"$1\" in ${NG_PAT}) ACTION=${ACT_PAT} ;; esac ;; *) ACTION=${ACT_PAT} ;; esac ;; esac" done rm -f ${TEMP} IFS="`echo stn | tr stn ' \011\012'`" LOGFILE=mail case ${ACTION} in drop) exit ;; log) echo "`date` Ignored ${PROG} ${ARTICLE} by ${FROM} (${PATHHOST})" 1>&2 exit ;; log=*) LOGFILE=`expr "${ACTION}" : 'log=[ ]*\(.*\)'` ACTION=logit ;; doit=*) LOGFILE=`expr "${ACTION}" : 'doit=[ ]*\(.*\)'` ACTION=doit ;; esac case "${LOGFILE}" in "") LOGFILE=/dev/null ;; mail|/*) ;; *) LOGFILE=${MOST_LOGS}/${LOGFILE}.log ;; esac export LOGFILE