#! /bin/sh

# send mail messages about new per-user DCC log files

# This script can be run by the daily DCC cron job after it has been
#	1. changed to contain the URL of the local DCC CGI scripts,
#	2. changed to use a locally suitable command to send mail
#	3. copied to the DCC libexec directory,
#	4. and made executable.
#   It is remotely possible that the default values in this script are
#	suitable and that you could use this script directly by putting
#	the following in the libexec directory:
#	    #! /bin/sh
#	    sh /var/dcc/cgi-bin/webuser-notify -d $*
#
# This script expects to be called by the standard DCC cron job to read a
#   series of user names on stdin, each of which has a new log file.
#   Each user name must be prefixed with the appropriate subdirectory such
#   as "local/".  The single argument to this script must be the
#   DCCM_USERDIRS or DCCIFD_USERDIRS_directory made into an absolute path.


# Copyright (c) 2017 by Rhyolite Software, LLC
#
# This agreement is not applicable to any entity which sells anti-spam
# solutions to others or provides an anti-spam solution as part of a
# security solution sold to other entities, or to a private network
# which employs the DCC or uses data provided by operation of the DCC
# but does not provide corresponding data to other users.
#
# Permission to use, copy, modify, and distribute this software without
# changes for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear in all
# copies and any distributed versions or copies are either unchanged
# or not called anything similar to "DCC" or "Distributed Checksum
# Clearinghouse".
#
# Parties not eligible to receive a license under this agreement can
# obtain a commercial license to use DCC by contacting Rhyolite Software
# at sales@rhyolite.com.
#
# A commercial license would be for Distributed Checksum and Reputation
# Clearinghouse software.  That software includes additional features.  This
# free license for Distributed ChecksumClearinghouse Software does not in any
# way grant permision to use Distributed Checksum and Reputation Clearinghouse
# software
#
# THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC
# BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# Rhyolite Software DCC 1.3.159-1.13 $Revision$


# http or https; prefer https.
HTTPS="https"

# URL of the CGI scripts
#   you will probably need to change this
BASE=`hostname`
BASE=`expr "$BASE" : '.*\.\([^.]*\.[^.]*$\)' \| "$BASE"`
BASE="www.$BASE/DCC-cgi-bin"


SWITCH='#webuser mail-notify'

USAGE="`basename $0`: [-x] -d userdirs"
USERDIRS=
while getopts "xd:" c; do
    case $c in
	x) set -x;;
	d) USERDIRS=$OPTARG;;
	*) ;;
    esac
done
shift `expr $OPTIND - 1 || true`
if test "$#" -ne 0 -o "$USERDIRS" = ""; then
    echo "$USAGE" 1>&2
    exit 1
fi
if test ! -d "$USERDIRS"; then
    echo "userdir $1 is not a directory" 1>&2
    exit 1
fi


while read NM; do
    # ignore users that are not configured to use the machinery
    if test ! -f "$USERDIRS/$NM/whiteclnt"; then
	continue;
    fi

    DIR="$USERDIRS/$NM"

    UNAME=`expr "$NM" : 'local/\(.*\)' \| "$NM"`
    OK=no
    BOX="$UNAME"
    eval `sed -n -e '/^[^#]/q'						\
	-e "s/^$SWITCH=on mailbox=$/OK=yes;/p"				\
	-e "s/^$SWITCH=on mailbox=\(.*\)/BOX=\1;OK=yes;/p"		\
	-e "s/^$SWITCH=off.*/OK=no;/p"	$USERDIRS/$NM/whiteclnt`
    if test "$OK" != yes; then
	# forget it if notifications are turned off for this user
	continue
    fi

    # Don't send a notification of messages older than this file,
    #	 because the user has already check them through the CGI scripts.
    MARKER=notify.marker

    # Postpone notifications until this file is current to avoid sending
    #	daily notes that the user is ignoring.
    BLOCK=notify.block

    # Send a notification when this file is current
    PENDING=notify.pending

    FND="find $DIR -follow"

    if test -f $DIR/$PENDING; then
	# Because `find -mtime -0` sometimes means  `find -mtime -1`
	# or vice versa, use this to see if $DIR/$PENDING is finally ready.
	rm -f $DIR/$MARKER
	touch $DIR/$MARKER
	if test "`$FND -name $PENDING -newer $DIR/$MARKER`" != ""; then
	    continue;
	fi
	rm $DIR/$PENDING

    else
	if test -f $DIR/$MARKER; then
	    if test "`$FND -name 'msg.*' -newer $DIR/$MARKER		\
			| head -1`" = ""; then
		# there are no messages the user has not seen
		continue
	    fi
	fi
	# We have at least one new message.  If we are blocked by having
	# sent a notification within the past week, make a pending message.
	rm -f $DIR/$MARKER
	touch $DIR/$MARKER
	if test "`$FND -name $BLOCK -newer $DIR/$MARKER`" != ""; then
	    mv $DIR/$BLOCK $DIR/$PENDING
	    continue;
	fi
    fi

    # browsers don't tolerate '/' or '@' in usernames and passwords in URLs
    URL_UNAME="`expr "$UNAME@" : '\([^/@]*@$\)' || true`$BASE"



    ####################################################################
    # Modify the following message to taste.

    MAIL_SUBJECT="bulk mail notification for $UNAME"
    if test "`basename /var/dcc/bin/sendmail`" = sendmail; then
	HEADERS="Subject: $MAIL_SUBJECT
Precedence: bulk
"
	CMD="/var/dcc/bin/sendmail $BOX"
    else
	HEADERS=
	CMD="/var/dcc/bin/sendmail -s '$MAIL_SUBJECT' $BOX"
    fi 
eval $CMD <<EOF
$HEADERS
Recently logged bulk messages for $UNAME can be viewed at
$HTTPS://$URL_UNAME/list-log
Edit your whitelist at
$HTTPS://$URL_UNAME/edit-whiteclnt
if any of those are solicited bulk messages instead of spam
or to stop or redirect these messages.

The user name for both web pages is $UNAME
EOF

    # no more of this mail for a week
    NWEEK=`/var/dcc/bin/perl -e 'use POSIX; 
	    print strftime("%y%m%d%H%M", localtime(time()+7*24*60*60))'`
    rm -f $DIR/$BLOCK
    touch -t "$NWEEK" $DIR/$BLOCK

done
