#!/bin/sh
# $Id: qmfilter,v 1.4 2003/08/20 05:18:28 yuuji Exp $

# REQUIRE: nkf (which has -m option)
# REQUIRE: "at" command's permission

mydir=`dirname $0`
daytoremove=7
checkerdir=$mydir/checkers
reporterdir=$mydir/reporter
reptime="0:10"
instant=''
RM=/bin/rm
PATH=/usr/local/bin:$PATH

error () {
  echo "$*" | Mail -s "qmfilter error" $owner
}

daily () {
  dir="$1"
  day="$2"
  chdir "$dir"
  echo "qmfilter dayly report in [$dir]"
  hfile="${day}.files"
  if [ ! -f "$hfile" ]; then
      echo "Header log file [$hfile] not found"
      return
  fi
  echo `cat $hfile | wc -l` "SPAM(?) message(s) on yesterday"
  echo ""
  echo "*** Summary ***"
  i=1
  cat "$hfile" | while read file; do
      echo -n "$i:"
      egrep -i '^(Return-path|From|Subject):' "$file" | \
	  nkf -m | sed 's/^/	/'
      i=`expr $i + 1`
  done
  echo ""
  echo "*** Received Headers ***"
  i=1
  cat "$hfile" | while read file; do
      echo -n "$i:"
      cat $file | egrep -i '^Return-path:' "$file" | nkf -m | sed 's/^/	/'
      cat $file | sed -ne '/^Received:.*HELO/,/^[A-Za-z]/p' 
      echo ""
      i=`expr $i + 1`
  done
  echo ""
  echo "*** Messages ***"
  i=1
  cat "$hfile" | while read file; do
      echo ""; echo ""; echo ""
      echo "--------------------[ Message $i ]--------------------"
      echo "Saved in;"
      echo "$file"
      echo ''
      head -50 $file
      echo ' :'
      echo "[Further message supressed...]"
      echo ""
      i=`expr $i + 1`
  done
}

#
# Set owner's address.
# If not set, exit abnormally
#
rc=$HOME/.qmfilterrc

if [ -s $mydir/.qmfilterrc ]; then
  rc=$mydir/.qmfilterrc
fi
if [ -s $rc ]; then
  # owner=`grep '^owner=' $rc`
  # [ "$owner" != "" ] && eval "$owner"		# set $owner
  for v in owner reptime daytoremove; do
      val=`awk -F= "/$v/"'{print $2}' $rc`
      [ x"$val" != x"" ] && eval "$v=\"$val\""
  done
fi
if [ "$owner" = "" ]; then
  touch $mydir/"Put owner=YourMailAddress in .qmfilterrc"
  exit 0
fi

# Daily Report
if [ "$1" = "daily" -a x"$2" != x"" ]; then
    shift
    daily "$@"
    exit 0
fi

if [ "$1" = "" ]; then
	error 'no recipient address specified'
	exit 0
fi

#
# Start scanning
#
today=`date +%Y%m%d`
stamp=`date +%Y%m%d.%H%M%S`.$$
recipient=$1
savedir=$mydir/save/$recipient
savefile=$savedir/$stamp
PATH=$PATH:/usr/ucb		# for SunOS5

[ -d $savedir ] || mkdir -p $savedir || error "Cannot mkdir $savedir "

docheck () {
  for checker in $checkerdir/*
  do
    echo $checker
    $checker "$1" || return 1
  done
  return 0
}

# Return-path line is required by daily reporter
(echo $RPLINE; cat) > $savefile
### env | sort -u > ENV
#if docheck $savefile ; then
if docheck $savefile > /dev/null 2>&1 ; then
  # do nothing and pass the message to real recipient
  case "$recipient" in
    *@*) ;;
    *)	if [ "$HOST" != "" ]; then
          recipient="$recipient@$HOST"
    	fi
  esac
  qmail-inject -- $recipient < $savefile
  $RM -f $savefile
else
  reporter=`echo $reporterdir/*` 
  case "$reporter" in
    *\*)	# no reporter found
	if [ "$instant" ]; then
	    (echo Troublesome mail has come as follows...
		echo "($SENDER -> $RECIPIENT)"
		echo "(Saved in $savefile)"
		echo ''
		head -50 $savefile
		echo ''
		echo '[Further message supressed...]')
	else
	    headerfile="$savedir/$today.files"
	    if [ ! -f "$headerfile" ]; then
		/usr/bin/at "$reptime" tomorrow <<EOF
$0 daily "$savedir" "$today" | Mail -s "qmfilter daily report" $owner
EOF
	    fi
	    echo "$stamp" >> $headerfile
	fi
	;;
    *)
    	for cmd in "$reporter"
	do
	  cmd $savefile | Mail -s "qmfilter scanning report" $owner
	done
	;;
  esac
fi

# Remove ancient files
#
find $savedir -mtime +$daytoremove -exec rm '{}' \;
