#!/usr/bin/env bash
#Change password for SSH and VNC
#Parameter: new_password or -conf to get password from rig.conf

#[ -t 1 ] &&
source colors

[[ -f $RIG_CONF ]] && source $RIG_CONF


check_user_pwd() {
  local arr=()
  readarray -t arr < <(grep -oP "^user:\\$\K[^:]+" /etc/shadow | tr '$' '\n')
  [[ -n ${arr[1]} && "$(openssl passwd -${arr[0]} -salt "${arr[1]}" "$1")" == "\$${arr[0]}\$${arr[1]}\$${arr[2]}" ]]
  return
}


get_vnc_pwd() {
	[[ ! -f $VNC_PASSWD ]] && return 2
	local pass=$(head -1 $VNC_PASSWD)
	[[ -z $pass ]] && return 3
	echo "$pass"
	return 0
}


check_vnc_pwd() {
	local pass
	pass="$(get_vnc_pwd)" || return
	[[ "$1" == "$pass" ]]
	return
}


check_user_pwd_vnc() {
	local pass
	pass="$(get_vnc_pwd)" || return
	check_user_pwd "$pass"
	return
}


set_user() {
	[[ -z $1 ]] && echo "${RED}Password is empty${NOCOLOR}" && return 1
	check_user_pwd "$1" && echo "${CYAN}User password was already set${NOCOLOR}" && return 0
	echo  "$1"$'\n'"$1"$'\n' | passwd user > /dev/null 2>&1
	exitcode=$?
	# no need
	#sed -i "s/^SET_RIG_PASS=.*/SET_RIG_PASS=/" $RIG_CONF
	[[ $exitcode -eq 0 ]] &&
		echo "${GREEN}User password changed successfully${NOCOLOR}" ||
		echo "${RED}User password setting error${NOCOLOR}"
	return $exitcode
}


set_vnc() {
	[[ -z $1 ]] && echo "${RED}Password is empty${NOCOLOR}" && return 1
	if check_vnc_pwd "$1"; then
		echo "${CYAN}VNC password was already set${NOCOLOR}"
		remote-connections x11vnc_start >/dev/null
	else
		#sed -i "1s/.*/$1/" "$VNC_PASSWD" #only 1 line
		other=$(tail -n+2 $VNC_PASSWD)
		echo "$1"$'\n'"$other" > $VNC_PASSWD
		echo "${GREEN}VNC password changed successfully${NOCOLOR}"
		remote-connections x11vnc_restart >/dev/null
	fi
	return 0
}


update_user() {
	#if [[ -z $SHADOW_USER ]]; then
	#	pass="$(get_vnc_pwd)" || return
	#	set_user "$pass"
	#	return
	#fi
	[[ ! "$SHADOW_USER" =~ ^user:[^\#]+:$ ]] && echo "${RED}Bad user password hash${NOCOLOR}" && return 2
	[[ "$SHADOW_USER" == $(grep "^user:" /etc/shadow) ]] && echo "${CYAN}User password was already set${NOCOLOR}" && return 0
	sed -i "s#^user:.*#$SHADOW_USER#g" /etc/shadow && echo "${GREEN}User password changed successfully${NOCOLOR}" && return 0
	echo "${RED}User password update error${NOCOLOR}"
	return 3
}


set_conf() {
	if [[ ! -f $RIG_CONF ]]; then
		echo -e "${RED}$RIG_CONF not found${NOCOLOR}"
		return 1
	fi

	unset RIG_PASSWD
	unset VNC_PASSWORD
	source $RIG_CONF

	if [[ -z $RIG_PASSWD ]]; then
		echo -e "${RED}RIG_PASSWD is empty${NOCOLOR}"
		return 2
	fi
	echo -e "Got user password from $RIG_CONF"
	set_user "$RIG_PASSWD"

	if [[ $VNC_ENABLE -ne 1 ]]; then
		echo -e "${RED}VNC service is disabled, skiping VNC password change${NOCOLOR}"
		return 0
	fi
	if [[ -z $VNC_PASSWORD ]]; then
		echo -e "${RED}VNC_PASSWORD is empty${NOCOLOR}"
		return 2
	fi
	echo -e "Got VNC password from $RIG_CONF"
	set_vnc "$VNC_PASSWORD"
}


case "$1" in

	check)
		check_vnc_pwd "${2:-${pass:-1}}" && check_user_pwd "${2:-${pass:-1}}"
	;;

	checkvnc)
		check_vnc_pwd "${2:-${pass:-1}}"
	;;

	checkuser)
		check_user_pwd "${2:-${pass:-1}}"
	;;

	set)
		[[ -z $2 ]] && echo "${RED}Password is empty${NOCOLOR}" && exit 1
		set_vnc "$2"
		set_user "$2"
	;;

	setuser)
		set_user "$2"
	;;

	setvnc)
		set_vnc "$2"
	;;

	updateuser)
		update_user "$2"
	;;

	conf)
		set_conf
	;;

	*)
		echo "${CYAN}Changes system password for \"user\" (SSH and VNC also)${NOCOLOR}"
		echo "  set|setuser|setvnc PASSWORD"
		echo "  check|checkuser|checkvnc PASSWORD"
		echo "  conf - use password from rig.conf"
	;;

esac


exit
