#!/bin/sh

APPLET=${0##*/}

usage() {
	cat << EOF

$0: get/put users, groups & passwords from/to save buffer
Usage: $APPLET {load|save}

Examples:
  # Retrieve data from save buffer (*not* from TFFS)
  $APPLET load

  # Put data to save buffer (*not* to TFFS)
  $APPLET save
  # Make save buffer persistent in TFFS
  modsave flash

EOF
}

[ $# -eq 0 ] && usage && exit 0
[ $# -ne 1 ] && usage >&2 && exit 1

PATH=/sbin:/bin:/usr/sbin:/usr/bin
FLASH_DIR=/tmp/flash
USER_DIR=$FLASH_DIR/users
TMP_DIR=/tmp
FILES="passwd group shadow gshadow"

make_user_dir()
{
	rm -rf $USER_DIR
	mkdir -pm 700 $USER_DIR
}

save()
{
	make_user_dir
	( cd $TMP_DIR && cp -a $FILES $USER_DIR	)
}

# BEGIN compat
# TODO: remove in one of the next releases, because it is obsolete
# and only needed for auto-conversion
test_load_compat()
{
	if [ ! -e "$FLASH_DIR/shadow.save" ]; then
		return 1
	fi
	echo "Obsolete user & password file $FLASH_DIR/shadow.save detected, converting..."

	TMPPASSWD=$TMP_DIR/.passwd.tmp
	TMPSHADOW=$TMP_DIR/.shadow.tmp
	rm -f $TMPPASSWD $TMPSHADOW

	userid=0
	cat $FLASH_DIR/shadow.save | while IFS=: read user pass; do
		if [ "$user" = "root" ]; then
			uid=0
			gid=0
			user_homedir=/mod/root
		else
			let userid="userid+1"
			uid=$userid
			gid=1
			user_homedir="/mod/home/$user"
		fi
		echo "$user:x:$uid:$gid:$user:$user_homedir:/bin/sh" >> $TMPPASSWD
		echo "$user:$pass:12332:0:99999:7:::" >> $TMPSHADOW
		
#		mkdir -p "$user_homedir"
#		chown $uid:$gid "$user_homedir"
	done

	if ! grep -q "^root:" $TMPPASSWD ; then
		rm -f $TMPPASSWD $TMPSHADOW
		echo "ERROR: no user 'root'" 1>&2
		return 1
	fi
	chmod 644 $TMPPASSWD
	chmod 600 $TMPSHADOW

	mv $TMPPASSWD $USER_DIR/passwd
	mv $TMPSHADOW $USER_DIR/shadow

	cp -a $TMP_DIR/group $TMP_DIR/gshadow $USER_DIR

	echo "Removing obsolete file $FLASH_DIR/shadow.save..."
	rm -f $FLASH_DIR/shadow.save
#	echo "Making data conversion persistent by saving to flash memory..."
#	save
#	modsave flash
	return 0
}
# END compat

init_passwd()
{
	return 0
#	WEBUI_PASSWD=$( allcfgconv -c -o - ar7 | sed -n -e '1,/webui/d' -e '/}/,$d' -e '/password/s/^.*"\(.*\)".*$/\1/p' )
#	CRYPT_PASSWD=$( httpd -m "$WEBUI_PASSWD" )
#	sed -i -e "s,^\(root:\)[^:]*\(.*\)$,\1${CRYPT_PASSWD}\2,g" $TMP_DIR/shadow
#	/usr/bin/modconf set mod MOD_HTTPD_PASSWD=$(/usr/sbin/httpd -m "$WEBUI_PASSWD")
}

load()
{
	if ! [ -d "$USER_DIR" ]; then
		make_user_dir
		# BEGIN compat
		test_load_compat ||
		# END compat
		init_passwd
	fi

	for f in $FILES; do
		if [ -e "$USER_DIR/$f" ]; then
			cp -a "$USER_DIR/$f" "$TMP_DIR"
		fi
	done
	cat /etc/passwd | while IFS=: read user pass uid gid gecos user_homedir shell; do
		if [ ! -d "$user_homedir" ]; then
			rm -f "$user_homedir"
			mkdir -p "$user_homedir"
			chown $uid:$gid "$user_homedir"
		fi
	done
}

case "$1" in
	save)
		save
		;;
	load)
		load
		;;
	*)
		usage >&2
		exit 1
		;;
esac
