#!/bin/sh 
#*********************************************************************
#   Copyright (c) International Business Machines  Corp., 2003, 2004
#
#   This program is free software;  you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 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 General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this pronram;  if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#  FILE   : su
#
#  PURPOSE: Tests the basic functionality of `su`.
#
#  SETUP: The program `/usr/bin/expect' MUST be installed.
#
#  HISTORY:
#    03/03    Dustin Kirkland (dkirklan@us.ibm.com)
#    03/03    Jerone Young    (jeroney@us.ibm.com)
#    10/01/04 Kris Wilson     Port to Red Hat
#
#*********************************************************************

if [ -z ${TCbin} ]
then
   export TCbin=$PWD
fi

export TEST_USER1="su_usr1"

tvar=${MACHTYPE%-*}
tvar=${tvar#*-}

# need to export tvar for su01_s1
export tvar
printf "Machine type is: $tvar\n\n"

if [ "$tvar" = "redhat" -o "$tvar" = "redhat-linux" ] 
# Need to also set group for TEST_USER2
then
export TEST_USER1_GROUP="wheel"
export TEST_USER2_GROUP="wheel"
else
export TEST_USER1_GROUP="trusted"
export TEST_USER2_GROUP="trusted"
fi
export TEST_USER1_PASSWD="eal"
export TEST_USER1_ENCRYPTED_PASSWD="42VmxaOByKwlA"
export TEST_USER1_NEW_PASSWD="a_very_good_and_long_password"
export TEST_USER1_HOMEDIR="/home/$TEST_USER1"

export TEST_USER2="su_usr2"
# Group needs to be trusted for Red Hat.
#export TEST_USER2_GROUP="trusted"
export TEST_USER2_PASSWD="eal"
export TEST_USER2_ENCRYPTED_PASSWD="42VmxaOByKwlA"
export TEST_USER2_HOMEDIR="/home/$TEST_USER2"

#This is for enviroment test
export TEST_LINE="YOU_HAVE_THE_VARIABLE"
export TEST_ENV_FILE="/tmp/TEST_ENV_FILE_ROOT"
export TEST_ENV_FILE_USER="/tmp/TEST_ENV_FILE_USER"
export TEST_ENV_FILE2="/tmp/TEST_ENV_FILE_ROOT2"
#-----------------------------------------------------------------------
# FUNCTION:  do_setup
#-----------------------------------------------------------------------

do_setup(){

#REMOVE ANY TEMPOARY FILES THAT MAY STILL BE AROUND
rm -f $TEST_ENV_FILE_USER > /dev/null 2>&1
rm -f $TEST_ENV_FILE2 > /dev/null 2>&1
rm -f $TEST_ENV_FILE > /dev/null 2>&1


#Create 1st test user
    #erase user if he may exist , so we can have a clean en
        rm -rf /home/$TEST_USER1
        userdel $TEST_USER1
	sleep 1

        useradd -m -g users $TEST_USER1
        if [ $? != 0 ]
        then {
                echo "Could not add test user $TEST_USER1."
                exit 1
        }
        fi
		
		usermod -G users,$TEST_USER1_GROUP $TEST_USER1

	#create users home directory (SLES 8 does not do this, even when specified in adduser)
# Only do this if not RH; RH creates the directory.
	if [ "$tvar" != "redhat" -a "$tvar" != "redhat-linux" ]
	then {
          USER_UID=`id -u $TEST_USER1`
          USER_GID=`id -g $TEST_USER1`
          mkdir $TEST_USER1_HOMEDIR
          chown -R $USER_UID.$USER_GID $TEST_USER1_HOMEDIR
	}
	fi

        usermod -p $TEST_USER1_ENCRYPTED_PASSWD $TEST_USER1 > /dev/null 2>&1
        if [ $? != 0 ]
        then {
                echo "Could not set password for test user $TEST_USER1"
                exit 1
        }
        fi

#Create 2nd test user
	#erase user if he may exist , so we can have a clean en
        rm -rf /home/$TEST_USER2
        userdel $TEST_USER2 
	sleep 1

        useradd -m -g users $TEST_USER2 
		
        if [ $? != 0 ]
        then {
                echo "Could not add test user $TEST_USER2."
                exit 1
        }
        fi

		usermod -G users,$TEST_USER2_GROUP $TEST_USER2
	
	#create users home diretory (SLES 8 does not do this, even when specified in adduser)
# Only do this if not RH; RH creates the directory.
        if [ "$tvar" != "redhat" -a "$tvar" != "redhat-linux" ]
        then {
          USER_UID=`id -u $TEST_USER2`
          USER_GID=`id -g $TEST_USER2`
          mkdir $TEST_USER2_HOMEDIR
          chown -R $USER_UID.$USER_GID $TEST_USER2_HOMEDIR
	}
	fi

        usermod -p $TEST_USER2_ENCRYPTED_PASSWD $TEST_USER2 > /dev/null 2>&1
        if [ $? != 0 ]
        then {
                echo "Could not set password for test user $TEST_USER2"
                exit 1
        }
        fi
}


#-----------------------------------------------------------------------
# FUNCTION:  do_cleanup
#-----------------------------------------------------------------------

do_cleanup() {
        rm -rf /home/$TEST_USER1
        rm -rf /home/$TEST_USER2
	userdel $TEST_USER1 
	userdel $TEST_USER2
	#REMOVE ANY TEMPOARY FILES THAT MAY STILL BE AROUND
	rm -f $TEST_ENV_FILE_USER > /dev/null 2>&1
	rm -f $TEST_ENV_FILE2 > /dev/null 2>&1
	rm -f $TEST_ENV_FILE > /dev/null 2>&1
}

#-----------------------------------------------------------------------
# FUNCTION:  MAIN
#-----------------------------------------------------------------------
do_setup
/bin/su $TEST_USER1 -c ${TCbin}/su01_s1
EXIT_CODE=$?
do_cleanup
exit $EXIT_CODE
