#!/bin/bash
# You can change the above to the good path to your "bash" binary if needed
#
# $Id: Manager1K.sh,v 1.4 2003/07/14 10:35:44 nighty Exp $
#

# some default script values
DBNAME="cservice"
DBHOST="127.0.0.1"

# default information to put in the db for those .., DO NOT USE a BLANK 'LASTMODIF', use "0".
LASTMODIFBY=`basename $0`
LASTMODIF="EXTRACT(EPOCH FROM now())::int4"



















# I suggest you dont modify stuff below this point unless you know what you are doing ;P





























PSQLCMD=""
echo -n "Checking for 'psql' binary... "
if [ -x /usr/local/pgsql/bin/psql ]; then
	PSQL="1"
	PSQLCMD="/usr/local/pgsql/bin/psql"
else
	PSQL="0"
	if [ -x `which psql | head -n 1` ]; then
		PSQL="1"
		PSQLCMD="psql"
	else
		PSQL="0"
	fi
fi

if [ "$PSQL" == "0" ]; then
	echo "not found."
	echo "--> Stopping..."
	echo "--> exit(1)"
	exit 1
else
	echo "Ok."
fi

echo "***********************************************************************"
echo "*                                                                     *"
echo "* GNUworld/mod.cservice level 1000 management script                  *"
echo "*                                                                     *"
echo "* With this script, you can make an existing user become a level 1000 *"
echo "* or create a new user that will be level 1000.                       *"
echo "* if you Modify a user already level 1000, he will be turned in 999.  *"
echo "*                                                                     *"
echo "*                                                                     *"
echo "* Warning: This program stops on any input error.                     *"
echo "*                                                                     *"
echo "***********************************************************************"
echo "\$Id: Manager1K.sh,v 1.4 2003/07/14 10:35:44 nighty Exp $"
echo "***********************************************************************"
echo "* Released under the GNU Public License                               *"
echo "***********************************************************************"
echo -n "<-- Database host/IP ? [$DBHOST] "
read -e NEWDBHOST
if [ "$NEWDBHOST" != "" ]; then
	echo "--> Using custom: $NEWDBHOST"
	DBHOST="$NEWDBHOST"
else
	echo "--> Using default: $DBHOST"
fi
echo -n "<-- Database name ? [$DBNAME] "
read -e NEWDBNAME
if [ "$NEWDBNAME" != "" ]; then
	echo "--> Using custom: $NEWDBNAME"
	DBNAME="$NEWDBNAME"
else
	echo "--> Using default: $DBNAME"
fi
echo -n "<-- (M)odify existing user or (C)reate new user ? [M] "
read -e REP1
if [ "$REP1" == "c" ]; then
	REP1="C"
fi
if [ "$REP1" == "m" ]; then
	REP1="M"
fi
if [ "$REP1" != "C" ]; then
	if [ "$REP1" != "M" ]; then
		REP1="M"
	fi
fi
FROMC="0"
FORCEUSERNAME=""
if [ "$REP1" == "C" ]; then
	echo "--> CREATE"
	echo -n "<-- User name ? "
	read -e REP2
	if [ "$REP2" == "" ]; then
		echo "--> ERROR: Invalid User name (blank)"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi
	NUMCHARU=`echo -n $REP2 | wc -c`
	NOTOKU0=`expr $NUMCHARU \> 12`
	NOTOKU1=`expr $NUMCHARU \< 2`
	if [ "$NOTOKU0" == "1" ]; then
		echo "--> ERROR: Too many chars in username ($NUMCHARU). Valid range: 2 to 12."
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi
	if [ "$NOTOKU1" == "1" ]; then
		echo "--> ERROR: Too few chars in username ($NUMCHARU). Valid range: 2 to 12."
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi

	FORCEUSERNAME="$REP2"
	if `echo -n "SELECT id FROM users WHERE lower(user_name)='$REP2'" | $PSQLCMD -h $DBHOST $DBNAME >/dev/null 2>&1`; then
		USRID=`echo -n "SELECT id FROM users WHERE lower(user_name)='$REP2'" | $PSQLCMD -h $DBHOST $DBNAME | head -n 3 | tail -n 1 | awk '{ print $1 }'`
		if [ "$USRID" != "(0" ]; then
			echo "--> ERROR: Invalid User name (already taken)"
			echo "--> Stopping..."
			echo "--> exit(1)"
			exit 1
		fi
	else
		echo "--> ERROR: Credentials provided for database connection are either invalid or database setup isn't correct."
		echo "--> ERROR: Connection to database '$DBNAME' at '$DBHOST' failed."
		echo "--> Stopping..."
		echo "--> exit(2)"
		exit 2
	fi


	echo -n "<-- E-Mail address ? "
	read -e REP2
	if [ "$REP2" == "" ]; then
		echo "--> ERROR: Invalid E-Mail address (blank)"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi
	USRID=`echo -n "SELECT id FROM users WHERE lower(email)='$REP2'" | $PSQLCMD -h $DBHOST $DBNAME | head -n 3 | tail -n 1 | awk '{ print $1 }'`
	if [ "$USRID" != "(0" ]; then
		echo "--> ERROR: Invalid E-Mail address (already taken)"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	else
		UEMAIL="$REP2"
		echo "!!! NOTICE: E-Mail is OK (not in use), but not checked against SYNTAX/NOREG/DOMAINLOCK. Assuming you know what you do ;P"
	fi

	echo "--> (1) What's your mother's maiden name ?"
	echo "--> (2) What's your dog's (or cat's) name ?"
	echo "--> (3) What's your father's birth date ?"
	echo -n "<--  What verification question (1, 2 or 3) ? [2] "
	read -e REP2
	REPOK="0"
	if [ "$REP2" == "" ]; then
		REP2="2"
	fi
	if [ "$REP2" == "1" ]; then
		REPOK="1"
	fi
	if [ "$REP2" == "2" ]; then
		REPOK="1"
	fi
	if [ "$REP2" == "3" ]; then
		REPOK="1"
	fi
	if [ "$REPOK" == "0" ]; then
		echo "--> ERROR: Invalid verification question choice ($REP2)"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi
	UQID="$REP2"

	echo -n "<-- Answer to the verification question (4 chars minimum) ? "
	read -e REP2
	if [ "$REP2" == "" ]; then
		echo "--> ERROR: Invalid answer (blank)"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi
	NUMCHAR=`echo -n $REP2 | wc -c`
	NOTOK=`expr $NUMCHAR \< 4`
	if [ "$NOTOK" == "1" ]; then
		echo "--> ERROR: You need at least 4 chars !"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi
	UVA="$REP2"

	echo -n "<-- Please specify the user password (no thing will be displayed on screen, 6 chars minimum) : "
	read -es PASS1
	echo ""
	NUMCHARP=`echo -n $PASS1 | wc -c`
	NOTOKP=`expr $NUMCHARP \< 6`
	if [ "$NOTOKP" == "1" ]; then
		echo "--> ERROR: You need at least 6 chars !"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi

	echo -n "<-- Please, this password again : "
	read -es PASS2
	echo ""
	if [ "$PASS1" != "$PASS2" ]; then
		echo "--> ERROR: Password mismatch"
		echo "--> Stopping..."
		echo "--> exit(1)"
		exit 1
	fi

	GENSALT=`mcookie | cut -b-8`

	ENCPART=`echo -n $GENSALT$PASS1 | md5sum | cut -f1 -d' '`
	ENCPASS="$GENSALT$ENCPART"

	echo "--> Crypted password    :  $ENCPASS"
	echo "-->             ENCODED :         [$ENCPART]"
	echo "-->             SALT    : [$GENSALT]"

	echo "--> Adding user '$FORCEUSERNAME'..."
	DAQRY="INSERT INTO users (user_name,password,email,url,question_id,verificationdata,language_id,public_key,last_updated_by,last_updated,signup_cookie,signup_ip,tz_setting) VALUES ('$FORCEUSERNAME','$ENCPASS','$UEMAIL','',$UQID,'$UVA',1,'','$LASTMODIFBY',EXTRACT(EPOCH FROM now())::int4,'Added from the console','127.0.0.1','')"
	echo "--> DB: `echo -n \"$DAQRY\" | $PSQLCMD -h $DBHOST $DBNAME`"
	FROMC="1"
	REP1="M"
fi
if [ "$REP1" == "M" ]; then
	if [ "$FORCEUSERNAME" == "" ]; then
		echo "--> MODIFY"
		echo -n "<-- User name ? "
		read -e REP2
		if [ "$REP2" == "" ]; then
			echo "--> ERROR: Invalid User name (blank)"
			echo "--> Stopping..."
			echo "--> exit(1)"
			exit 1
		fi
	else
		REP2="$FORCEUSERNAME"
	fi
	if `echo -n "SELECT id FROM users WHERE lower(user_name)='$REP2'" | $PSQLCMD -h $DBHOST $DBNAME >/dev/null 2>&1`; then
		USRID=`echo -n "SELECT id FROM users WHERE lower(user_name)='$REP2'" | $PSQLCMD -h $DBHOST $DBNAME | head -n 3 | tail -n 1 | awk '{ print $1 }'`
		if [ "$USRID" == "(0" ]; then
			echo "--> ERROR: Invalid User name (non existant)"
			echo "--> Stopping..."
			echo "--> exit(1)"
			exit 1

		fi
	else
		echo "--> ERROR: Credentials provided for database connection are either invalid or database setup isn't correct."
		echo "--> ERROR: Connection to database '$DBNAME' at '$DBHOST' failed."
		echo "--> Stopping..."
		echo "--> exit(2)"
		exit 2
	fi

	if [ "$FROMC" == "1" ]; then
		if [ "$USRID" == "1" ]; then
			echo "--> NOTICE: It's the first user inserted.. which means you probably never used 'cservice.addme.sql' on that database ($DBNAME)"
			echo "--> NOTICE: We will be running what should be at this moment just like if you ran 'cservice.addme.sql'"
			echo "--> NOTICE: You will NOT need to run 'cservice.addme.sql' anymore, so don't run it ;P"

			ADDADMCHAN="INSERT into channels (name,flags,channel_ts,registered_ts,last_updated) VALUES ('*',1,EXTRACT(EPOCH FROM now())::int4,31337,EXTRACT(EPOCH FROM now())::int4)"
			ADDCODERCHAN="INSERT into channels (name,flags,channel_ts,registered_ts,last_updated) VALUES ('#coder-com',1,EXTRACT(EPOCH FROM now())::int4,31337,EXTRACT(EPOCH FROM now())::int4)"
			ADDCODERACCESS="INSERT into levels (channel_id,user_id,access,added_by,added,last_modif_by,last_modif,last_updated) VALUES (2,1,500,'$LASTMODIFBY',$LASTMODIF,'$LASTMODIFBY',$LASTMODIF,EXTRACT(EPOCH FROM now())::int4)"

			echo "--> Inserting ADMIN (*) channel..."
			echo "--> DB: `echo -n \"$ADDADMCHAN\" | $PSQLCMD -h $DBHOST $DBNAME`"
			echo "--> Inserting CODER (#coder-com) channel..."
			echo "--> DB: `echo -n \"$ADDCODERCHAN\" | $PSQLCMD -h $DBHOST $DBNAME`"
			echo "--> Inserting level 500 access for '$FORCEUSERNAME' on '#coder-com'..."
			echo "--> DB: `echo -n \"$ADDCODERACCESS\" | $PSQLCMD -h $DBHOST $DBNAME`"
		fi
	fi


	ADMINLVL=`echo -n "SELECT access FROM levels WHERE channel_id=1 AND user_id=$USRID" | $PSQLCMD -h $DBHOST $DBNAME | head -n 3 | tail -n 1 | awk '{ print $1 }'`

	echo -n "--> users.id = $USRID          current admin level = "
	if [ "$ADMINLVL" == "(0" ]; then
		echo "0"
	else
		echo $ADMINLVL
	fi

	if [ "$ADMINLVL" == "1000" ]; then
		echo "--> Modifying ADMIN access from $ADMINLVL to 999..."
		DAQRY="UPDATE levels SET access=999,last_modif_by='$LASTMODIFBY',last_modif=$LASTMODIF,last_updated=EXTRACT(EPOCH FROM now())::int4 WHERE channel_id=1 AND user_id=$USRID AND access=$ADMINLVL"
		echo "--> DB: `echo -n \"$DAQRY\" | $PSQLCMD -h $DBHOST $DBNAME`"
	else
		if [ "$ADMINLVL" == "(0" ]; then
			echo "--> Adding ADMIN access at level 1000..."
			DAQRY="INSERT INTO levels (channel_id,user_id,access,added_by,added,last_modif_by,last_modif,last_updated) VALUES (1,$USRID,1000,'$LASTMODIFBY',$LASTMODIF,'$LASTMODIFBY',$LASTMODIF,EXTRACT(EPOCH FROM now())::int4)"
			echo "--> DB: `echo -n \"$DAQRY\" | $PSQLCMD -h $DBHOST $DBNAME`"
		else
			echo "--> Modifying ADMIN access from $ADMINLVL to 1000..."
			DAQRY="UPDATE levels SET access=1000,last_modif_by='$LASTMODIFBY',last_modif=$LASTMODIF,last_updated=EXTRACT(EPOCH FROM now())::int4 WHERE channel_id=1 AND user_id=$USRID AND access=$ADMINLVL"
			echo "--> DB: `echo -n \"$DAQRY\" | $PSQLCMD -h $DBHOST $DBNAME`"
		fi
	fi


fi

echo "--> Job finished !"
echo "--> NOTICE: Remember your CService bot updates his cache on a regular basis"
echo "--> NOTICE: depending on your cservice.conf file this can take a few minutes for the changes/addition to be available on IRC."
echo "--> Stopping..."
echo "--> exit(0)"

exit 0

# EOF
