#!/bin/sh
# This file is part of the Savane project
# <http://gna.org/projects/savane/>
#
# $Id$
#
#  Copyright 2005      (c) Michael Casadevall <sonicmctails--ssonicnet.com>
#
# The Savane project 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.
#
# The Savane project is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with the Savane project; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

# 
#  This Script emulates the useradd command that is 
#  standard in many UNIX like Operating Systems
#  this script should be placed in /usr/sbin
#  it should be owned by root.admin and chmod 755  
#
#  FIXES in this vesrion 1.01:
#  fixed an error in the home directory creation system
#  made it possible to have a user without a password ( sysuser )
#  Chris Roberts
#  chris@osxgnu.org
#
###########

# script version
version="1.01"

get_free_uid()
{
	continue="no"
	number_used="dontknow"
	fnumber=501
	until [ $continue = "yes" ]; do
		if [ `/usr/bin/nidump passwd . |/usr/bin/cut -d":" -f3 |/usr/bin/grep -c "^$fnumber$"` -gt 0 ]; then
			number_used=true
		else
			number_used=false
		fi
		
		if [ $number_used = "true" ]; then
			fnumber=`/bin/expr $fnumber + 1`
		else
			export UserID="$fnumber"
			continue="yes"
		fi
	done;
}
createuser(){

if [  `/usr/bin/nidump passwd . |/usr/bin/grep -c "^$user:"` -eq 0 ]; then 
        get_free_uid
	if [ $g -eq "0" ]; then 
     		 export GroupID="20"
        fi
else
	if [ $g -eq 1 ]; then 
		if [ `/usr/bin/nidump group . |/usr/bin/grep -c "$GroupID"` -ne 1 ]; then
			>&2 echo  "useradd: ERROR Group '$GroupID' does not exist"
        		exit 1
		fi
        else
		export GroupID=`/usr/bin/nidump passwd . | /usr/bin/grep '$user:'| /usr/bin/cut -d":" -f4`
	fi

        if [ $u -eq 1 ];then
		if [ `/usr/bin/nidump passwd . | /usr/bin/grep '$user:'|/usr/bin/cut -d":" -f3 |/usr/bin/grep -c "^$UserID$"` -ne 1 ]; then
		 	if [ `/usr/bin/nidump passwd . |/usr/bin/cut -d":" -f3 |/usr/bin/grep -c "^$UserID$"` -gt 0 ]; then
				>&2 echo "useradd: ERROR UID '$UserID' is in use" 
       		 	
			exit 7
 
  			fi
		fi
      		if [ $override -ne 1 ];then
				>&2 echo "useradd: WARNING UID specified for existing user $user without -o UID ignored" 
				export UserID=`/usr/bin/nidump passwd . | /usr/bin/grep '$user:'| /usr/bin/cut -d":" -f3`
		fi
   	else
		if [ $u -eq 0 ];then
			export UserID=`/usr/bin/nidump passwd . | /usr/bin/grep "$user:"| /usr/bin/cut -d":" -f3`
		fi
	fi

fi
	if [ -z $GroupID ]; then 
     		 export GroupID="20"
        fi

# here we copy a short perl script to make the crypted password
if [ $p -ne 0 ];then
       echo "#!/usr/bin/perl
\$passwd= \$ARGV[0];
srand(\$\$|time);
@saltchars=(a..z,A..Z,0..9,'.');
\$salt=\$saltchars[int(rand(\$#saltchars+1))];
\$salt.=\$saltchars[int(rand(\$#saltchars+1))];
\$pwd= crypt(\$passwd,\$salt);
print \$pwd;" > /tmp/passwd.pl
        /bin/chmod a+rx "/tmp/passwd.pl"
        passwd=`/tmp/passwd.pl "$password"`
        #/bin/rm /tmp/passwd.pl
fi
	/usr/bin/niutil -create . /users/$user
if [ $c -ne 0 ];then
	/usr/bin/niutil -createprop . /users/$user realname "$realname"
fi
	/usr/bin/niutil -createprop . /users/$user gid $GroupID
	/usr/bin/niutil -createprop . /users/$user uid $UserID
 	/usr/bin/niutil -createprop . /users/$user home "$home"
    	/usr/bin/niutil -createprop . /users/$user name "$user"
if [ $p -ne 0 ];then
 	/usr/bin/niutil -createprop . /users/$user passwd "$passwd"
else
	/usr/bin/niutil -createprop . /users/$user passwd "*"
fi
	/usr/bin/niutil -createprop . /users/$user shell "$shell"
	/usr/bin/niutil -createprop . /users/$user change $change
	/usr/bin/niutil -createprop . /users/$user expire $expire
if [ $m -ne 0 ];then
	/bin/mkdir -p "$home"
        /usr/sbin/chown "$UserID.$GroupID" "$home"
fi
if [ $d -ne 0 ];then
        /bin/mkdir -p "$home"
        /usr/sbin/chown "$UserID.$GroupID" "$home"
fi
	/usr/bin/niutil -createprop . /users/$user sharedDir "" 
}


usage()
 {
 
cat <<EOF
       USAGE:
       useradd [-c comment] [-d home_dir]
                 [-e expire_date] [-f inactive_time]
                 [-g initial_group] [-G group[,...]]
                 [-m ] [-s shell] [-u uid [ -o]] [-n] [-p passwd] login

       READ useradd (8) manpage for more data.

EOF
    exit $bye
}

#are we root
check_uid() {
    if [ "`whoami`" = root ]
    then
	UID=0
    else
	if [ "$UID" = "" ]
	then
	    UID=-1
	fi
    fi
    export UID
}



#case the options and prams
export realname=""
export stdhome=0
export s=0
export d=0
export G=0
export f=0
export g=0
export u=0
export p=0
export c=0
export m=0
export shell="/bin/tcsh"
export e=0
export expire=0
export change=0
export override=0
while [ $# -ne 0 ]
do
    case "$1" in
    --help)
            usage
            ;;
 --version)
            echo "useradd: version $version, by Chris Roberts"
            echo "useradd: (c) 2002-2003 Chris Roberts <chris@osxgnu.org> "
            exit 0
            ;;
        -c)
	    export c=1
	    shift
            export realname="$1"
            ;;
        -d)
            export d=1
	    shift
            export home="$1"
            ;;
        -e)
           export e=1
	    shift
            expire="$1"
            ;;
        -f)
           export f=1
	    shift
            export change="$1"
            ;;
        -g)
            export g=1
	    shift 
            export GroupID="$1"
            ;;
        -G)
           export G=1
	    shift
            export GROUPS="$1"
           ;;
        -m)
	  export m=1          
  stdhome=1
	   
            ;;
        -p) 
          export  p=1
	    shift
            export password="$1"
            ;;
        -s)
          export  s=1
	    shift
            export shell="$1"
            ;;
        -u)
          export  u=1
	    shift
            export UserID="$1"
            ;;
        -o)
          export  override=1 
            ;;	
        -*)
            echo "Unknown option: $1"
            usage 1
            ;;
         *)
 	    export user="$1"
            ;;
    esac
    shift
done

export staff=20

if [ -z $user ]; then
   echo "useradd: You Must provide a Login"
   usage 1
fi
if [ $s -eq "1" ]; then
    if [ -z $shell ]; then
        echo "useradd: -s requires a valid shell"
        usage 1
    fi
    if [ ! -x "$shell" ]; then       
        echo "useradd: -s requires a valid shell can't use-find $shell"
        usage 1
    fi
fi
if [ $stdhome -eq "1" ]; then
    export home="/Users/$user"
    if [ $d -eq "1" ]; then
        export d=0
	echo "useradd: WARNING -m overrides -d home set to /Users/$user try useradd --help"
    fi
fi
if [ $d -eq "1" ]; then
    if [ -z $home ]; then
         export d=0
          export home="/Users/$user"
          echo "useradd: WARNING -d missing home_dir home set to /Users/$user try useradd --help"
    fi
fi

if [ $u -eq "1" ]; then
    if [ -z $UserID ]; then  
       export u=0
        echo "useradd: WARNING -u requires a UID. ignored try useradd --help"
    fi
fi
if [ $c -eq "1" ]; then
    if [ -z $realname ]; then
	echo "useradd: WARNING -c requires an argument. ignored try useradd --help"
    fi
fi

if [ $e -eq "1" ]; then
    if [ -z $expires ]; then
	echo "useradd: WARNING -e requires an argument. ignored try useradd --help"
    fi
fi
if [ $f -eq "1" ]; then
    if [ -z $change ]; then
	echo "useradd: WARNING -f requires an argument. ignored try useradd --help"
    fi
fi
createuser 


