#!/bin/sh
#
# abmails*s - do something only abmail files in spam folders for system use
#
# Copyright (C) 2007-2008 Taiji Yamada <taiji@aihara.co.jp>
#
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Affero General Public License for more details.
#
#
# usage:
#   # abmails*s [[-c preexec] -- abmails-*_args] root sales taiji
#
upriv=nobody
upriv_procmailrc=/etc/procmailrcs/aliases.rc
upriv_spool=/var/spool/abmail
fwhose(){ # $0 [-u|-g] [-n] file [...]
  perl -s -e 'for $arg (@ARGV) { if (($un,$gn)=(stat($arg))[4,5]) {
    ($un,$gn)=((getpwuid($un))[0],(getgrgid($gn))[0]) if (!$n);
    if ((!$u&&!$g)||($u&&$g)) { printf "%s.%s\n", $un, $gn; }
    elsif ($u) { printf "%s\n", $un; }
    else { printf "%s\n", $gn; }
  }}' -- "$@"
}
dirranges(){ # -d=nday -p=prefix
  perl -s -e 'use POSIX; $tm=time(); for ($i=$d; $i>0; $i--) { print strftime("$p%Y%m%d\n",localtime($tm-$i*60*60*24)); }' -- "$@"
}
DEFAULT_ANTISPAMDIRS="`dirranges -d=1 -p=\"spam-\"`"
ABMAILFLAGS=""
while true; do
  case "$1" in
  -c) OPT_PREEXEC="$1"; shift; PREEXEC="$1";;
  -?*) ABMAILFLAGS="${ABMAILFLAGS} $1";;
  *) break;;
  esac
  shift
done
ABMAIL=`echo "$0" | sed 's|s$||'`
case "$ABMAIL" in
*./*) ABMAIL_ROOT="`pwd`/"; export ABMAIL_ROOT; ABMAIL="`basename \"$ABMAIL\"`";;
esac
uname_s="`uname -s`"
echoalias(){ # $0 alias [/etc/aliases]
  sed -ne "\
s/^$1:[ 	]*\(.*\)/\1/p\
" "${2:-/etc/aliases}"
}
echoalias_quote(){ # $0 alias
  echo "$1" | sed -ne "\
s/^\(\".*[^\\]\"\).*/\1/p\
"
}
echoalias_var(){ # $0 quote var
  echo "$1" | sed -ne "\
s/.* $2=['\"]\(.*[^\]\)['\"] .*/\1/p;s/.* $2=\([^'\"][^ ]*\).*/\1/p\
"
}
echoalias_rc(){ # $0 quote
  echo "$1" | sed -ne "\
s|.*\(/etc/procmailrcs/[^ \"]*\).*|\1|p
"
}
echoalias_user(){ # $0 rc
  [ "$1" != "" ] && fwhose -u "$1"
}
for name in "$@"; do
  OWNER=
  ANALIAS=
  ALIAS="`echoalias ${name}`"
  ALIAS_QUOTE="${ALIAS:+`echoalias_quote \"$ALIAS\"`}"
  if [ "${ALIAS}" != "" ] && [ "${ALIAS_QUOTE}" != "" ]; then
    case "$ALIAS_QUOTE" in
    *${upriv_procmailrc}*)
      WHO="${upriv}"
      OWNER=`echoalias_var "$ALIAS_QUOTE" OWNER`
      ALIASES=`echoalias_var "$ALIAS_QUOTE" ALIASES`
      ANALIAS=`echoalias_var "$ALIAS_QUOTE" ANALIAS`
      PROCMAILARGS="OWNER=${OWNER} ALIASES='${ALIASES}' ANALIAS=${ANALIAS} ${upriv_procmailrc}"
      MAILDIR="${upriv_spool}/${name}"
      ;;
    *)
      THISRC=`echoalias_rc "${ALIAS_QUOTE}"`
      WHO=`echoalias_user "${THISRC}"`
      PROCMAILARGS="${THISRC}"
      MAILDIR=
      ;;
    esac
  else
    WHO="${name}"
    PROCMAILARGS=
    MAILDIR=
  fi
  case "${uname_s}" in
  *BSD|Darwin)	[ "$WHO" = "${upriv}" ] && suargs="-m $WHO" || suargs="- $WHO";;
  Linux)	suargs="- $WHO -s /bin/sh";;
  SunOS|*)	suargs="- $WHO";;
  esac
  if [ "${LOGNAME}" != "${WHO}" ]; then
    echo su ${suargs} -c "env PATH=/opt/local/bin:/usr/bin:/bin:/usr/sbin:/usr/lib LD_LIBRARY_PATH=/opt/local/lib PROCMAILARGS=\"${PROCMAILARGS}\" MAILDIR=${MAILDIR} DEFAULT_ANTISPAMDIRS=\"${DEFAULT_ANTISPAMDIRS}\" OWNER=\"${OWNER}\" ANALIAS=\"${ANALIAS}\" \"${ABMAIL_ROOT:-./}${ABMAIL}\" ${OPT_PREEXEC} ${OPT_PREEXEC:+'${PREEXEC}'} ${ABMAILFLAGS}"
    su ${suargs} -c "env PATH=/opt/local/bin:/usr/bin:/bin:/usr/sbin:/usr/lib LD_LIBRARY_PATH=/opt/local/lib PROCMAILARGS=\"${PROCMAILARGS}\" MAILDIR=${MAILDIR} DEFAULT_ANTISPAMDIRS=\"${DEFAULT_ANTISPAMDIRS}\" OWNER=\"${OWNER}\" ANALIAS=\"${ANALIAS}\" \"${ABMAIL_ROOT:-./}${ABMAIL}\" ${OPT_PREEXEC} ${OPT_PREEXEC:+'${PREEXEC}'} ${ABMAILFLAGS}"
  else
    echo env PATH=/opt/local/bin:/usr/bin:/bin:/usr/sbin:/usr/lib LD_LIBRARY_PATH=/opt/local/lib PROCMAILARGS="${PROCMAILARGS}" MAILDIR=${MAILDIR} DEFAULT_ANTISPAMDIRS="${DEFAULT_ANTISPAMDIRS}" "${ABMAIL_ROOT:-./}${ABMAIL}" ${OPT_PREEXEC} ${OPT_PREEXEC:+"${PREEXEC}"} ${ABMAILFLAGS}
    env PATH=/opt/local/bin:/usr/bin:/bin:/usr/sbin:/usr/lib LD_LIBRARY_PATH=/opt/local/lib PROCMAILARGS="${PROCMAILARGS}" MAILDIR=${MAILDIR} DEFAULT_ANTISPAMDIRS="${DEFAULT_ANTISPAMDIRS}" "${ABMAIL_ROOT:-./}${ABMAIL}" ${OPT_PREEXEC} ${OPT_PREEXEC:+"${PREEXEC}"} ${ABMAILFLAGS}
  fi
done
