#!/bin/bash

# Copyright Jean-Philippe Guillemin <jp.guillemin@free.fr>. 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. Please take a look at http://www.gnu.org/copyleft/gpl.htm
# Version 1.7 changes by Teran McKinney (sega01).

# Userconfig can:
# - list existing users/groups and their properties
# - create/delete users and groups
# - modify any user properties


# version='1.0'  # - 30/10/2005
# version='1.1'  # - 01/11/2005 - change some buttons labels
# version='1.2'  # - 04/11/2005 - fixed "Never" expiry problem
# version='1.3'  # - 30/11/2005 - bugfix space in realname
# version='1.4'  # - 30/11/2005 - improved password dialog window
# version='1.5'	 # - 31/03/2006 - bugfix expiry problem
# version='1.6'	 # - 21/04/2007 - password box
# version='1.7'	 # - 07/06/2007 - text changes, default to never expire
# version='1.8'	 # - 15/04/2008 - dynamic available user groups detection 
#version='1.9'    # - 06/08/2009 - fixed chpasswd to not forget rest of
# over 8 char long password 
# version='2.0'    # - 19/02/2014 - fix passwd policy
version='2.1'    # - 19/02/2016 - new "adduser" quick option

# Take a look at "Xdialog" and use it instead of "dialog" in case X is running
if [[ "$DISPLAY" && "$(which Xdialog 2>&1 | grep -v "which: no")" ]]; then
	dialog="Xdialog --icon userconfig"
	xwindow="yes"
else
	dialog="dialog"
	xwindow="nope"
fi

# Gettext internationalization
export TEXTDOMAIN="userconfig"
export TEXTDOMAINDIR="/usr/share/locale"
. gettext.sh

# Path needs to be extended in case you're only half a root:)
export PATH="${PATH}:/usr/sbin:/sbin"


if [[ "$DISPLAY" && "$(which xterm 2>&1 | grep -v "which: no")" ]]; then
	terminal="xterm -bg black -fg red -geometry 48x12 -e"
else
	terminal=""
fi


skeleton='/etc/skel'
defaultshell='/bin/bash'
defaultgroup='users'
pwfile='/etc/passwd'
grpfile='/etc/group'
shadowfile='/etc/shadow'

for isgroupinzen in audio video lp cdrom fuse dialout floppy plugdev netdev scanner power polkitd taratata ; do
	grep -q "^${isgroupinzen}:" $grpfile && useraddmembership="${isgroupinzen},${useraddmembership}"
done
useraddmembership="$( echo ${useraddmembership} | sed -e 's/^\(.*\),$/\1/' )"


###############################################
# What do you want to do ?

promptaction() {
mode=$(${dialog} \
--stdout \
--cancel-label "$(eval_gettext 'Exit')" \
--title "User management" \
--menu \
"\n $(eval_gettext 'Welcome to') $(basename $0), $(eval_gettext 'please choose an option:')\n\n" \
17 70 7 \
   "$(eval_gettext 'List users')" "$(eval_gettext 'List existing users and edit their properties')" \
   "$(eval_gettext 'New user')" "$(eval_gettext 'Create a new user')" \
   "$(eval_gettext 'List groups')" "$(eval_gettext 'List groups and their members')" \
   "$(eval_gettext 'New group')" "$(eval_gettext 'Create a new group')" )

if [ ! "$mode" ]; then
  mode="none"
fi
	
}

###############################################
# list existing users

showusers() {
	liste=$(cat $pwfile \
	| sed -e 's/^\(.*\):x:\(.*\):.*:.*:.*:.*$/\1\ \2\ /')
	user=$(${dialog} --stdout --title "$(eval_gettext 'User list')" \
		--ok-label "$(eval_gettext 'Select')" \
		--cancel-label "$(eval_gettext 'Menu')" \
		--menu \
		"\n $(eval_gettext 'Users of the system:')" 30 70 20 \
		${liste})
}

###############################################
# list existing groups

showgroups() {
	liste=$(cat $grpfile | \
		sed -e 's/^\(.*\):.*:\(.*\):.*$/\1 \2 /')
		
	if [ "$xwindow" == "yes" ] ; then
		group=$($dialog \
		--stdout --title "$(eval_gettext 'Group list')" \
		--cancel-label "$(eval_gettext 'Menu')" \
		--ok-label "$(eval_gettext 'Select')" \
		--check "$(eval_gettext 'Show members')" off \
		--menu \
		"\n $(eval_gettext 'Groups of the system:')" 20 70 11 \
		${liste})
	else
		group=$($dialog \
		--stdout --title "$(eval_gettext 'Group list')" \
		--cancel-label "$(eval_gettext 'Menu')" \
		--ok-label "$(eval_gettext 'Select')" \
		--menu \
		"\n $(eval_gettext 'Groups of the system:')" 20 70 11 \
		${liste})	
	fi

	check="$(echo "$group" | tail -n1)"
	group="$(echo "$group" | head -n1)"

}

###############################################
# Get user parameters from system

getsysteminfo() {
	uid="$(grep -e "^$user:.*$" $pwfile | cut -d: -f 3 )"
	gid="$(grep -e "^$user:.*$" $pwfile | cut -d: -f 4 )"
	homedir="$(grep -e "^$user:.*$" $pwfile | cut -d: -f 6 )"
	shell="$(grep -e "^$user:.*$" $pwfile | cut -d: -f 7 )"
	group="$(groups "$user" | sed -e 's/^.*: \(.*\)$/\1/' | cut -d \  -f 1 )"
	membership="$(groups "$user" | sed -e 's/^.*: \(.*\)$/\1/' | cut -d \  -f 2- )"
	expirydays="$(grep -e "^$user:.*$" $shadowfile | cut -d: -f 8 )"
	if [ "$expirydays" ]; then
		expiry="$(date -u --date "Jan 1, 1970 + $expirydays days" +%Y-%m-%d)" # usermod date format
	else
		expiry="never"
	fi
	fingerinfo="$(grep -e "^$user:.*$" $pwfile | cut -d: -f 5 )"
	realname="$(echo $fingerinfo | cut -d , -f 1 )"
	office="$(echo $fingerinfo | cut -d , -f 2 )"
	workphone="$(echo $fingerinfo | cut -d , -f 3 )"
	homephone="$(echo $fingerinfo | cut -d , -f 4 )"

}

###############################################
# Show user info
showuserinfo() {
	if [ "$xwindow" == "yes" ]; then
		parameter=$($dialog --stdout \
		--title "$(eval_gettext 'User information')" \
		--ok-label "$(eval_gettext 'Select')" \
		--cancel-label "$(eval_gettext 'Done')" \
		--check "$(eval_gettext 'Delete user')" off \
		--menu "\n $(eval_gettext 'Detailed information for user') $user:" 30 65 20 \
		"$(eval_gettext 'Real Name')" "$realname" \
		"$(eval_gettext 'User Name')" "$user ($uid)" \
		"$(eval_gettext 'Main Group')" "$group ($gid)" \
		"$(eval_gettext 'Home')" "$homedir" \
		"$(eval_gettext 'Shell')" "$shell" \
		"$(eval_gettext 'Membership')" "$membership" \
		"$(eval_gettext 'Expiry')" "$expiry" \
		"$(eval_gettext 'Office')" "$office" \
		"$(eval_gettext 'Work phone')" "$workphone" \
		"$(eval_gettext 'Home phone')" "$homephone" \
		"$(eval_gettext 'Password')" "********" )
	else
		parameter=$($dialog --stdout \
		--title "$(eval_gettext 'User information')" \
		--ok-label "$(eval_gettext 'Select')" \
		--cancel-label "$(eval_gettext 'Done')" \
		--menu "\n $(eval_gettext 'Detailed information for user') $user:" 30 65 20 \
		"$(eval_gettext 'Real Name')" "$realname" \
		"$(eval_gettext 'User Name')" "$user ($uid)" \
		"$(eval_gettext 'Main Group')" "$group ($gid)" \
		"$(eval_gettext 'Home')" "$homedir" \
		"$(eval_gettext 'Shell')" "$shell" \
		"$(eval_gettext 'Membership')" "$membership" \
		"$(eval_gettext 'Expiry')" "$expiry" \
		"$(eval_gettext 'Office')" "$office" \
		"$(eval_gettext 'Work phone')" "$workphone" \
		"$(eval_gettext 'Home phone')" "$homephone" \
		"$(eval_gettext 'Password')" "********" )		
	fi
	check="$(echo "$parameter" | tail -n1)"
	parameter="$(echo "$parameter" | head -n1)"

}

###############################################
# Show user info
showgroupmembers() {

	gid="$(grep -e "^$group:.*$" $grpfile | cut -d: -f 3)"
	members="$(grep -e "^$group:.*$" $grpfile | cut -d: -f 4 | tr "," " ")"
	for user in $(grep -e "^.*:x:.*:$gid:.*$" $pwfile \
		| sed -e 's/^\(.*\):x:.*:.*:.*:.*:.*$/\1/' \
		| tr "\n" " ") ; do
		members="$(echo $members | sed -e "s/^\(.*\)$user\(.*\)$/\1\2/")"
		members="$members $user"
	done

	if [ "$members" ]; then
	liste=""
	for user in $members
	do
	   uid="$(grep -e "^$user:.*$" $pwfile | cut -d: -f 3 )"
	   liste="$liste
	$user $uid"
	done

	user=$($dialog --stdout \
		--title "$(eval_gettext 'Group members')" \
		--ok-label "$(eval_gettext 'Select')" \
		--cancel-label "$(eval_gettext 'Back')" \
		--menu \
		"\n $(eval_gettext 'Members of group') $group:" 20 70 11 \
		${liste})

	else
		$dialog --title "Group members" --msgbox \
		"\nNo user in group $group" 12 75
		return 0
	fi
}


###############################################
# Set the user name 
setusername() {
	result="nok"
	current="$user"
	user=$($dialog --stdout \
		--title "$(eval_gettext 'User name')" \
		--ok-label "$(eval_gettext 'Commit')" \
		--cancel-label "$(eval_gettext 'Abort')" \
		--inputbox "$(eval_gettext 'Enter the user name for user') ${user}:" 11 70 $user)
	[ ! "$user" ] && user="$current"
	if [ "$current" ]; then
		message="$(usermod -l $user $current 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

###############################################
# Create new user
newuser() {
	result="nok"

	if [ "$xwindow" == "yes" ] ; then
		user=$($dialog --stdout \
		--title "$(eval_gettext 'User name')" \
		--check "$(eval_gettext 'System user')" off \
		--ok-label "$(eval_gettext 'Commit')" \
		--cancel-label "$(eval_gettext 'Abort')" \
		--inputbox "$(eval_gettext 'Enter the user name for user') ${user}:" 11 70 $user)
	else
		user=$($dialog --stdout \
		--title "$(eval_gettext 'User name')" \
		--ok-label "$(eval_gettext 'Commit')" \
		--cancel-label "$(eval_gettext 'Abort')" \
		--inputbox "$(eval_gettext 'Enter the user name for user') ${user}:" 11 70 $user)
	fi
	
	check="$(echo "$user" | tail -n1)"
	user="$(echo "$user" | head -n1)"

	if [ "$user" ]; then
		for membershipgroup in $(echo $useraddmembership | tr "," " ") ; do
			groupadd $membershipgroup 2>/dev/null
		done
		if [ "$check" != "checked" ]; then
			message="$(useradd -s $defaultshell -g $defaultgroup -m -k $skeleton -G $useraddmembership "$user" 2>&1 && result="ok")"
			if [ ! $? = 0 ]; then
				$dialog --title "Warning" --msgbox "\n $message \n" 8 65
			else
				chfn -f "$user" $user 2>/dev/null
				chfn -f "$user" $user 2>/dev/null
				chfn -r "Zenwalk users" $user 2>/dev/null
				getsysteminfo
				setpw
			fi
		else
			message="$(useradd -s $defaultshell -g nobody -r -M "$user" 2>&1)"
			[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65 || result="ok"
		fi
	fi
}

###############################################
# Set the main group name
setgroup() {
	result="nok"
	current="$group"
	group=$($dialog --stdout --title "Groupname" --cancel-label "Skip" \
			--inputbox \
			"Enter the group for user $user:" 11 70 $group)
	if [ "$group" ]; then
		 message="$(usermod -g $group $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

###############################################
# Set the home dir
sethomedir() {
	result="nok"
	current="$homedir"
	homedir=$($dialog --stdout --title "$(eval_gettext 'Home directory')" \
			--cancel-label "$(eval_gettext 'Skip')" \
			--inputbox "$(eval_gettext 'Enter the home directory for user') \
			$user:" 11 70 $homedir)
	if [ "$homedir" ]; then
		message="$(usermod -d $homedir $user 2>&1 && result="ok")"
	[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
		if [ -e $homedir ]; then
			chown -R $user:$group $homedir 2>/dev/null
		else
			cp -rf $skeleton $homedir 2>/dev/null
			chown -R $user:$group $homedir 2>/dev/null
		fi
	fi
	current=""
}

###############################################
# Set the shell
setshell() {
	result="nok"
	current="$shell"
	shell=$($dialog \
		--stdout --title "$(eval_gettext 'Shell')" \
		--cancel-label "Skip" --inputbox \
		"$(eval_gettext 'Enter the shell interpreter for user') $user:" 11 70 \
		$shell)
	if [ "$shell" != "$current" ]; then
		message="$(usermod -s $shell $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

###############################################
# Set additional group membership
setmembership() {
	result="nok"
	current="$membership"
	usermodmembership="$(echo $membership | tr " " "," )"
	membership=$($dialog --stdout \
		--title "$(eval_gettext 'Additional groups membership')" \
		--cancel-label "Skip" \
		--inputbox "$(eval_gettext 'Enter a list of additional groups for user') $user:$group:" 11 70 \
		$usermodmembership)
	if [ "$membership" != "$current" ]; then
		usermodmembership="$(echo $membership | tr " " "," )"
		message="$(usermod -G $usermodmembership $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

###############################################
# Set expiry date
setexpiry() {
	result="nok"
	# date must be in format DD MM YYYY for dialog
	if [ "$expirydays" ]; then
		dialogdate="$(date -u --date "Jan 1, 1970 00:00:00 + $expirydays days" +%d\ %m\ %Y 2>/dev/null)"
	else
		dialogdate="$(date -u +%d\ %m\ %Y 2>/dev/null)"
	fi

	dialogdate=$($dialog --stdout \
		--cancel-label "$(eval_gettext 'Never')" \
		--defaultno \
		--calendar "$(eval_gettext 'Set account expiry date') " 0 70 $dialogdate)

	# converting dialog outputs DD/MM/YYYY into YYYY-MM-DD for usermod
	expiry="$(echo "$dialogdate" | sed -e "s/^\([0-9]*\)\/\([0-9]*\)\/\([0-9]*\)/\3-\2-\1/")" # usermod date format
	usermod -e "" $user 2>/dev/null
	if [ "$expiry" ]; then
		message="$(usermod -e "$expiry" $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi

}

###############################################

# Password checking
changepw(){

if [ "$xwindow" == "yes" ]; then
	securedialog='Xdialog --stdout --ignore-eof --password --icon passwordconfig --inputbox'
else
	securedialog='dialog --stdout --insecure --fixed-font --smooth --passwordbox'
fi

maxcount=3
minlength=5

count=1 ; pw='_'
while [ "${pw}" != "${password}" ]; do
	password="" ; pw='_'
	if [ $count -gt $maxcount ]; then
		echo -n ""
		break
	fi

	message="Enter new password for user ${1} (#${count} try):"
	[ $count -ge 2 ] && message="$(eval_gettext 'Passwords do not match, enter password for user') ${1} (#${count} try):"
	while [ "$(echo -n "${pw}" | wc --chars)" -lt ${minlength} ]; do
		pw="$(${securedialog} "${message}" 12 80)"
		[ $? != 0 ] && return 1
		message="$(eval_gettext 'Password is too short') (${minlength} chars minimum), $(eval_gettext 'please try another one:')"		
	done
	password="$pw" ; pw='_'
	message="$(eval_gettext 'Enter new password again for user') ${1} (#${count} try):"
	pw="$(${securedialog} "${message}" 12 80)"
	[ $? != 0 ] && return 1
	count=$((count+1))

done

echo -n $password
}

# Change password
setpw() {

	[ "$user" ] && pass="$(changepw ${user})"
	[ $? == 1 ] && return 1
	if [ ! "$pass" ] ; then
		${dialog} --msgbox "$(eval_gettext 'Failed to set password for user') \"${user}\"" 8 70
	else
		# echo "${user}:${pass}"
		
		if [ "$(id -u)" == "0" ]; then
			[ "$user" ] && echo "${user}:${pass}" | /usr/sbin/chpasswd 1>/dev/null 2>&1 && result="ok"
		else
			[ "$user" ] && echo "${user}:${pass}" | /usr/bin/pkexec /usr/sbin/chpasswd 1>/dev/null 2>&1 && result="ok"
		fi
	fi
}

###############################################
# Set finger info
setrealname() {
	result="nok"
	current="$realname"
	realname=$($dialog --stdout --title "$(eval_gettext 'Real name')" \
		--no-cancel \
		--inputbox "$(eval_gettext 'Enter the real name of user') \
		$user:" 11 75 "$realname")
	if [ "$realname" != "$current" ]; then
		message="$(chfn -f "$realname" $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

setoffice() {
	result="nok"
	current="$office"
	office=$($dialog --stdout \
		--title "$(eval_gettext 'Office information')" \
		--no-cancel \
		--inputbox "$(eval_gettext 'Enter office information for user') \
		$user:" 11 75 "$office")
	if [ "$office" != "$current" ]; then
		message="$(chfn -r "$office" $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

setworkphone() {
	result="nok"
	current="$workphone"
	workphone=$($dialog --stdout \
		--title "$(eval_gettext 'Work phone')" \
		--no-cancel \
		--inputbox "$(eval_gettext 'Enter work phone number for user') \
		$user:" 11 75 "$workphone")
	if [ "$workphone" != "$current" ]; then
		message="$(chfn -w "$workphone" $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

sethomephone() {
	result="nok"
	current="$homephone"
	homephone=$($dialog --stdout --title "$(eval_gettext 'Home phone')" \
		--no-cancel \
		--inputbox "$(eval_gettext 'Enter home phone number for user') \
		$user:" 11 75 "$homephone")
	if [ "$homephone" != "$current" ]; then
		message="$(chfn -h "$homephone" $user 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
	fi
	current=""
}

###############################################
# Delete a user
killuser() {
	result="nok"
	if [ "$user" ]; then
		if [ "$user" == "root" ]; then
		$dialog --title "Warning" --msgbox "\n $(eval_gettext 'No way to delete') $user\n" 8 65
		return 0
		else
			$dialog --stdout --title "$(eval_gettext 'Sure ?')" \
				--cancel-label "Abort" \
				--ok-label "Proceed" \
				--cancel-label "$(eval_gettext 'Abort')" \
				--yesno "\n $(eval_gettext 'Delete ') $user $(eval_gettext ': are you sure?')\n" 8 65 
			[ ! $? = 0 ] && return 0
			message="$(userdel -f $user 2>&1 && result="ok")"
			if [ ! $? = 0 ]; then 
				$dialog --title "Warning" --msgbox "\n $message \n" 8 65
			else
				$dialog --title "Done" --msgbox "\n $user $(eval_gettext 'deleted') \n" 8 65
			fi
			return 0
		fi
	fi
}

###############################################
# Delete a group
killgroup() {
	result="nok"
		if [ "$group" ]; then
			if [ "$group" == "root" ]; then
			$dialog --title "Warning" --msgbox "\n $(eval_gettext 'No way to delete') $group \n" 8 65 
			return 0
			else
				$dialog --stdout --title "$(eval_gettext 'Sure ?')" \
					--cancel-label "Abort" \
					--ok-label "Proceed" \
					--cancel-label "$(eval_gettext 'Abort')" \
					--yesno "\n $(eval_gettext 'Delete ') $group $(eval_gettext ': are you sure?')\n" 8 65 
					[ ! $? = 0 ] && return 0
				message="$(groupdel $group 2>&1 && result="ok")"
				if [ ! $? = 0 ] ; then
					$dialog --title "Warning" --msgbox "\n $message \n" 8 65 
				else
					$dialog --title "Done" --msgbox "\n $group $(eval_gettext 'deleted') \n" 8 65
				fi
				return 0
			fi
		fi
}

###############################################
# Set the group name or create the group if new name
editgroup() {
	result="nok"
	current="$group"
	if [ "$xwindow" == "yes" ]; then
		group=$($dialog --stdout \
		--title "$(eval_gettext 'Group')" \
		--ok-label "$(eval_gettext 'Select')" \
		--check "$(eval_gettext 'Delete group')" off \
		--inputbox "$(eval_gettext 'Enter the name for group') $group:" 11 75 $group)
	else
		group=$($dialog --stdout \
		--title "$(eval_gettext 'Group')" \
		--ok-label "$(eval_gettext 'Select')" \
		--inputbox "$(eval_gettext 'Enter the name for group') $group:" 11 75 $group)
	fi
	
	check="$(echo "$group" | tail -n1)"
	group="$(echo "$group" | head -n1)"
	
	if [ "$check" == "checked" ]; then
		group=$current
		killgroup
	else
		if [ "$current" ]; then
			if [ "$group" ]; then
				message="$(groupmod -n $group $current 2>&1 && result="ok")"
				[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65
			fi
		fi
	fi
	current=""
}

###############################################
# Create a new group
newgroup() {
	result="nok"
	group=$($dialog --stdout --title "$(eval_gettext 'Group')" \
		--ok-label "$(eval_gettext 'Commit')" \
		--cancel-label "$(eval_gettext 'Abort')" \
		--inputbox "$(eval_gettext 'Enter the new group name') $group:" 11 75 $group)
	
	if [ "$group" ]; then
		message="$(groupadd $group 2>&1 && result="ok")"
		[ ! $? = 0 ] && $dialog --title "Warning" --msgbox "\n $message \n" 8 65 
	fi
}

###############################################
# Edit a user

edituser() {
	if [ "$user" ]; then
		while [ "1" = "1" ] ; do
			parameter=""
			getsysteminfo
			showuserinfo
			if [ "$check" == "checked" ]; then
				killuser
				break
			fi
			if [ "$parameter" ]; then
				case $parameter in		
				$(eval_gettext 'User Name'))
					setusername
					getsysteminfo
					;;
				$(eval_gettext 'Main Group'))
					setgroup
					getsysteminfo
					;;
				$(eval_gettext 'Home'))
					sethomedir
					getsysteminfo
					;;
				$(eval_gettext 'Membership'))
					setmembership
					getsysteminfo
					;;
				$(eval_gettext 'Shell'))
					setshell
					getsysteminfo
					;;
				$(eval_gettext 'Expiry'))
					setexpiry
					getsysteminfo
					;;
				$(eval_gettext 'Real Name'))
					setrealname
					getsysteminfo
					;;
				$(eval_gettext 'Office'))
					setoffice
					getsysteminfo
					;;
				$(eval_gettext 'Work phone'))
					setworkphone
					getsysteminfo
					;;
				$(eval_gettext 'Home phone'))
					sethomephone
					getsysteminfo
					;;
				$(eval_gettext 'Password'))
					if [ "$user" ]; then
						setpw
						if [ "$result" == "ok" ]; then			
							$dialog --title "$(gettext 'Password changed')" --msgbox "\n $(eval_gettext 'Password changed for user') $user \n" 8 65
						else
							$dialog --title "$(gettext 'Canceled')" --msgbox "\n $(eval_gettext 'Password not changed for') $user \n" 8 65
						fi
					fi
					;;
				esac
			else
				break
			fi
		done
	fi
}

# Quick options for unprivileged user
if [ "$1" ]; then
	case "$1" in
		'passwd')
		result="nok"
		user=$2
		[ "$user" == "" ] && user="$(whoami)"
		setpw
		if [ "$result" == "ok" ]; then			
			$dialog --title "$(gettext 'Password changed')" --msgbox "\n $(eval_gettext 'Password changed for user') $user \n" 8 65
		else
			$dialog --title "$(gettext 'Canceled')" --msgbox "\n $(eval_gettext 'Password not changed for') $user \n" 8 65
		fi
		exit
		;;
	esac
fi


if [ "$(id -u)" != "0" ]; then
	$dialog --title "$(eval_gettext 'Root only')" --msgbox "$(eval_gettext 'You need to be root to run ') $(basename $0)" 8 65 
	exit
fi

# Quick options for root
if [ "$1" ]; then
	case "$1" in
		'adduser')
			$dialog --title "$(gettext 'Unprivileged user creation')" --msgbox "\n $(eval_gettext 'Ready to create a new user ?') $user\n" 8 65
			user=""
			newuser
			while [ "$result" != "ok" ] ; do
				[ "$result" != "ok" ] && $dialog --stdout --title "$(eval_gettext 'Retry ?')" \
				--cancel-label "Abort" --ok-label "Retry" --yesno "\n $(eval_gettext 'Do you want to retry ?') \n" 8 65 
				[ ! $? = 0 ] && break
				user=""
				newuser
			done
			if [ "$result" == "ok" ]; then
				getsysteminfo
				edituser
			fi 
		exit 0
		;;
	esac
fi


###############################################
# main()
	while [ "1" = "1" ] ; do
	user=""
	showusers
	if [ "$user" ]; then
		edituser
	else
		break
	fi
	done
while [ "1" = "1" ] ; do
	promptaction
	case $mode in
		$(eval_gettext 'List users'))
			while [ "1" = "1" ] ; do
				user=""
				showusers
				if [ "$user" ]; then
					edituser
				else
					break
				fi
			done
			;;
		$(eval_gettext 'New user'))
			user=""
			newuser
			if [ "$result" == "ok" ]; then
				getsysteminfo
				edituser
			fi
			;;
		$(eval_gettext 'List groups'))
			while [ "1" = "1" ] ; do
				group=""
				showgroups
				if [ "$check" == "checked" ]; then
					showgroupmembers
					if [ "$user" ]; then
						getsysteminfo
						showuserinfo
					fi
				elif [ "$group" ]; then
					editgroup
					getsysteminfo
				else
					break
				fi
			done
			;;
		$(eval_gettext 'New group'))
			group=""
			newgroup
			if [ "$result" == "ok" ]; then
				showgroups
			fi
			;;
		none)
			exit
	esac
done

# end
