#!/bin/bash
#
# vpopmail_admind
# Copyright 2004, Bill Shupp
# Version: 1.0 (initial release)
#
# This is a simple shell script to allow remote addition and deletion of 
# vpopmail users, to be run from tcpserver.  It supports only a few commands:
#
# quit 
# user <username>
# pass <password>
# adduser <emailaddress> <password>
# deluser <emailaddress>
#
# NOTES: authentication must succeed before the adduser/deluser commands will
# be accepted. quit may be issued at any time. Incorrect number of arguments
# to any command other than quit will result in "-ERR syntax error".
#
#
#
#  Sample run script for tcpserver:
#
##!/bin/sh
#exec /usr/local/bin/softlimit -m 8000000 \
#    /usr/local/bin/tcpserver -v -H -R -l 0 \
#    -x /home/vpopmail/etc/vpopmail_admind.cdb \
#    -u `id -u vpopmail` -g `id -g vpopmail` 0 2112 \
#    /usr/local/sbin/vpopmail_admind 2>&1
#
#
# Sample run script for multilog:
#!/bin/sh
#exec /usr/local/bin/setuidgid vpopmail /usr/local/bin/multilog t /var/log/vpopmail_admind




# CONFGURATION OPTIONS
VADDUSER=/home/vpopmail/bin/vadduser
VDELUSER=/home/vpopmail/bin/vdeluser
USER='admin'
PASS='testpass'


################### SHOULD NOT NEED TO EDIT BELOW HERE ########################

# FUNCTIONS
strip_return () {
	echo ${1} | sed -e 's/\r//g'
}

# AUTHENTICATION

HAVEUSER=0
HAVEPASS=0
echo "+OK"
while [ $HAVEUSER != 1 ] && [ $HAVEPASS != 1 ] ; do

	# GET USERNAME via USER command
	read COMMANDFROMSHELL ARGUMENT1
	COMMAND=`strip_return $COMMANDFROMSHELL | awk '{ print toupper($1) }'`
	if [ "$COMMAND" = "QUIT" ] ; then
		echo "+OK"
		exit
	fi
	if [ "$COMMAND" != "USER" ] ; then
		echo "-ERR authentication first"
		continue
	fi

	if [ -z "$ARGUMENT1" ] ; then
		echo "-ERR syntax error"
		continue
	else
		HAVEUSER=1
		USERGIVEN=`strip_return ${ARGUMENT1}`
	fi

	echo "+OK"

	# GET PASS via PASS command
	read COMMANDFROMSHELL ARGUMENT1
	COMMAND=`strip_return "$COMMANDFROMSHELL" | awk '{ print toupper($1) }'`
	if [ "$COMMAND" = "QUIT" ] ; then
		echo "+OK"
		exit
	fi
	if [ "$COMMAND" != "PASS" ] ; then
		echo "-ERR authentication first"
		continue
	fi

	if [ -z "$ARGUMENT1" ] ; then
		echo "-ERR syntax error"
		continue
	else
		HAVEPASS=1
		PASSGIVEN=`strip_return ${ARGUMENT1}`
	fi

done

if [ "${USERGIVEN}" != "${USER}" ] || [ "${PASSGIVEN}" != "${PASS}" ] ; then
	echo "-ERR authentication failed"
	exit
else
	echo "+OK"
fi

# AUTHENTICATION COMPLETE

# GET COMMAND

HAVECOMMAND=0
while [ $HAVECOMMAND != 1 ] ; do

	# GET COMMAND
	read COMMANDFROMSHELL ARG1 ARG2
	COMMAND=`strip_return ${COMMANDFROMSHELL} | awk '{ print toupper($1) }'`
	ARGUMENT1=`strip_return ${ARG1}`
	ARGUMENT2=`strip_return ${ARG2}`
	if [ "$COMMAND" = "QUIT" ] ; then
		echo "+OK"
		exit
	fi
	if [ "$COMMAND" != "ADDUSER" ] && [ "$COMMAND" != "DELUSER" ] ; then
		echo "-ERR unimplemented"
		continue
	fi

	if [ "$COMMAND" = "ADDUSER" ] ; then
		if [ -z "$ARGUMENT1" ] ; then
			echo "-ERR syntax error"
			continue
		fi
		if [ -z "$ARGUMENT2" ] ; then
			echo "-ERR syntax error"
			continue
		fi
		RESULT=`$VADDUSER $ARGUMENT1 $ARGUMENT2`
		if [ "$?" -ne 0 ] ; then
			echo "-ERR $RESULT"
			echo "$RESULT:$COMMAND $ARGUMENT1 $ARGUMENT2" 1>&2
			# Log Error
			echo "ERROR: $VADDUSER $ARGUMENT1 $ARGUMENT2 - $RESULT" 1>&2
		else
			echo "+OK"
			# Log Success
			echo "Added $ARGUMENT1 with pass $ARGUMENT2" 1>&2
		fi
	fi
		
	if [ "$COMMAND" = "DELUSER" ] ; then
		if [ -z "$ARGUMENT1" ] ; then
			echo "-ERR syntax error"
			continue
		fi
		if [ ! -z "$ARGUMENT2" ] ; then
			echo "-ERR syntax error"
			continue
		fi
		RESULT=`$VDELUSER $ARGUMENT1`
		if [ "$?" -ne 0 ] ; then
			echo "-ERR $RESULT"
			# Log Error
			echo "ERROR: $VDELUSER $ARGUMENT1 $ARGUMENT2 - $RESULT" 1>&2
		else
			echo "+OK"
			echo "Deleted $ARGUMENT1" 1>&2
		fi
		
	fi

done
