#!/bin/sh
# @vasm : USERADD
# @level: root
# @description: quick add a user, all defaults
# 
# (c) Kocil, 2003
# (c) VLocity Linux, 2003
#
# Released under GNU GPL

VDIR=$(dirname $0)
. $VDIR/vasm-functions

check_root

# Path to files
pfile=/etc/passwd
gfile=/etc/group
sfile=/etc/shells

# Paths to binaries
CHMOD=/bin/chmod
USERADD=/usr/sbin/useradd

# Defaults
defhome=/home
defshell=/bin/bash
defskel=/etc/skel
defchmod=700
picdir=/usr/share/apps/kdm/pics/users/

######################################################################################
## MAIN

# get login name from param
LOGIN="$1"
U_NAME="$2"
U_ID=""
G_ID="users"
G_EXTRA="audio,video,cdrom,games,lp"
U_HOME="${defhome}/${LOGIN}"
U_SHELL="${defshell}"

# ASK Login Name
menuA()
{
while [ 1 ]; do
  TITLE="ADD USER"
  TEXT="Login name for the new user (lower case and digit):"

  inputbox "$TEXT" "$TITLE" "$LOGIN"
  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS

  LOGIN=$(cat $freply)
  U_NAME=`echo $LOGIN | awk '{ print toupper(substr($1,1,1)) substr($1,2)}'`

  if [ -z "$LOGIN" ]; then
    continue    
  elif [ "`echo $LOGIN | grep -e '[A-Z]'`" ]; then
    retrybox "User '$LOGIN' contains illegal characters (CAPITAL)"
  elif [ "`echo $LOGIN | grep -e '[^a-z0-9_-]'`" ]; then
    retrybox "User '$LOGIN' contains illegal characters"
  elif [ "`grep -e "^${LOGIN}:" $pfile`" ]; then
    retrybox "User '$LOGIN' is already exist"
  else
    return 0
  fi
done
}

menuB() {

# Ask long name
while [ 1 ]; do
  TITLE="ADD USER"
  TEXT="Enter real name (alphanumeric):"

  inputwizard "$TEXT" "$TITLE" "$U_NAME"
  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS

  U_NAME=$(cat $freply)

  if [ "`echo $U_NAME | grep -e '[^A-Za-z0-9 .;,_-]'`" ]; then
     retrybox "Name '$U_NAME' contains illegal characters"
  else
     return 0
  fi
done
}

menuC() {

N_ID=`awk -F: 'BEGIN {id=1000} { if ($3 >= id) id=$3+1 } END { print id}' $pfile`
while [ 1 ]; do
  U_ID=$N_ID
  TITLE="ADD USER"
  TEXT="Enter user ID (integer 1000-60000. Empty for next ID)"
  inputwizard "$TEXT" "$TITLE" "$U_ID"
  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS

  U_ID=$(cat $freply)
  if [ -z "$U_ID" ]; then
    U_ID=$N_ID
    break;
  elif [ "`echo $U_ID | grep -e [^0-9]`" ]; then
    msgbox "UIDs are numerical only"
  elif [ "`grep -e "^.*:.*:$U_ID:.*" $pfile`" ]; then
    msgbox "That UID is already in use; please choose another" 
  else
    break
  fi
done
}


menuD() {
  TITLE="SET GROUPS"
  TEXT="\nWhat groups do you want this user belongs to?"
  DIMENSION="18 54 10"

$DCMD --backtitle "$BACKTITLE" --title "$TITLE" \
  --separator ',' \
  --checklist "$TEXT" $DIMENSION \
  "plugdev" "user can un/mount pendrive" on \
  "netdev" "user can connect to wicd" on \
  "disk" "user can un/mount removable HD" on \
  "cdrom" "user can access CD/CDW/DVD" on \
  "floppy" "user can access floppy disks" on \
  "lp"    "user can access printers" on \
  "scanner" "user can access scanner" on \
  "audio" "user can access audio devices" on \
  "video" "user can access video devices" on \
  "games" "user can play restricted games" on \
  "slocate" "user can use locate database" on \
  "adm"   "administrators (e.g: backup)" off \
  "sys"   "sysadmins (e.g: set cups,samba)" off  \
  "wheel" "elite users" off  2> $freply

  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS
  if [ "$CMD" ]; then
    G_EXTRA="users,`cat $freply | sed -e 's!/!,!g'`"
  else
    G_EXTRA="users,`cat $freply | sed -e 's/ /,/g'`"
    # since Slack 10.2, dialog add "" as separator 
    G_EXTRA=`echo $G_EXTRA | sed -e 's/"//g'`
  fi
  return 0
}

menuE() {

  # Get default
  G_ID="$LOGIN"
  U_HOME="${defhome}/${LOGIN}"
  U_SHELL="${defshell}"

  DIMENSION="17 70 2"
  TITLE="ADD USER"
  TEXT="\n
We are going to add this user \n
  Login Name..: $LOGIN\n
  Real Name...: $U_NAME\n
  User ID.....: $U_ID\n
  User Groups.: $G_EXTRA\n
  Home........: $U_HOME\n
Say YES if you are really sure:"

  $WCMD $LEFT_ALIGN --backtitle "$BACKTITLE" --title "$TITLE" --menu "$TEXT" $DIMENSION \
  "YES" "Create the user then set the password" \
  "NO"  "Cancel and quit" \
  2> $freply


  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS
  
  reply=$(cat $freply)
  
  if [ "$reply" != "YES" ]; then
     clean_exit
  fi

}

menuF() {

  infobox "Creating user ....."
  # Add the account to the system
  if [ -d $picdir ];then
	ln -s $picdir/default3.png $picdir/$LOGIN.face.icon
  fi
  CMD_UID=${U_ID:+"-u $U_ID"}
  dbug "$USERADD -m -s $U_SHELL $CMD_UID $CMD_NAME $LOGIN"

  HOME_EXST=""
  if [ -d "$U_HOME" ]; then
    HOME_EXIST=1
  fi

  # redhat like system !
  groupdel $LOGIN &>/dev/null

  if groupadd -g $U_ID $LOGIN 2> $freply; then
    if [ "$U_NAME" ]; then
      $USERADD -m -s $U_SHELL -u $U_ID -c "$U_NAME" -g $LOGIN -G "$G_EXTRA" $LOGIN 2> $freply
    else
      $USERADD -m -s $U_SHELL -u $U_ID -g $LOGIN -G "$G_EXTRA" $LOGIN 2> $freply
    fi
    if [ $? = 0 ]; then
      dbug "User has been created"
      $VDIR/vpasswd "$LOGIN"
      # Set home permissions
      if [ "$HOME_EXIST" = "1" ]; then
        chmod $defchmod $U_HOME &> /dev/null
        chown -R $LOGIN $U_HOME &> /dev/null
        $VDIR/vskel $LOGIN
      fi
      clean_exit 0
    fi
  fi
  errorbox "\n$(cat $freply)"
  clean_exit 1
}

##################################
# testing
#LOGIN=aaaa
#U_NAME=
#U_ID=
#G_ID="users"
#U_HOME="${defhome}/${LOGIN}"
#U_SHELL="${defshell}"
#menuE
#userdel aaaa

############################################
# Main Program

wizard menuA menuB menuC menuD menuE menuF

