#!/bin/bash
SOURCE="$0"
source /usr/lib/elive-tools/functions
EL_REPORTS="1"

. gettext.sh
export TEXTDOMAIN="elive-tools"

#set -e
######################## Improved debug: seems like sometimes the installer reports wrongly created users
# ERR is catched too an inherited in parents, needed
set -E

# catch signals
set -o functrace
shopt -s extdebug

error_signal_debug(){
    trapped="$?"

    if [[ -n "$trapped" ]] && ! ((ignore_error_signal_debug)) ; then
        el_warning "trapped signal: '${trapped}' from '${FUNCNAME[1]}' in lines '${BASH_LINENO[*]}'"
        is_trapped_signal=1
    fi
}
########################

FIRST_UID=1000
LAST_UID=60000

. /etc/adduser.conf

# FIXME: since the installer requires also the same thing, make a "functions" file for create new users, source it from the installer and call the functions to create a new user, simple fast and easy
#       - TODO: another option is to write it in ELM / RUBY and good, with the option to create it or to generate a script (to run then inside the chroot), note that the installer GUI will look different then

# TODO: adduser and debconf-utils can be removed as dependency by improving this script

# passwd dep
#USERADD=useradd
USERDEL=userdel
# adduser dep
ADDUSER=adduser
DELUSER=deluser

if [ -z "$DHOME" ]; then
    DHOME=/home
fi
if [ -z "$USERS_GID" ]; then
    USERS_GID=100
fi


guitool="/usr/bin/zenity --window-icon=/usr/share/icons/gnome/256x256/apps/logo-elive.png"
temp_error="/tmp/$(basename $0)-${USER}-$$"

el_dependencies_check "zenity|yad|chpasswd|debconf-get-selections|grep|groupadd|elive-skel|chown|su|${USERADD}|${ADDUSER}|useradd|${USERDEL}"

if [[ -e "/var/lib/dpkg/info/systemd.list" ]] && [[ -e "/var/lib/dpkg/info/live-config-systemd.list" ]] ; then
    is_systemd=1
else
    is_sysvinit=1
fi


###########################################################################
exit_error(){
    if [[ -s "$temp_error" ]] ; then
        $guitool --error --text="Error, $( cat "${temp_error}" )"
    else
        $guitool --error
    fi

    exit
}
###########################################################################
exit_ok(){
    rm -f "${temp_error}" 2>/dev/null
}
###########################################################################
trap "exit_ok" EXIT
#trap "exit_error" 1 3 5 6 14 15 ERR TERM
trap "exit_error" 1 3 5 6 14 15 TERM
trap "error_signal_debug" ERR
###########################################################################



###########################################################################
pass_verify(){
    if [[ "$userpass" != "$repeatpass" ]] ; then
        $guitool --error --text="$( eval_gettext "The passwords are not the same, try again" )"
        pass_step
    fi

    if [[ -z "$userpass" ]] ; then
        $guitool --error --text="$( eval_gettext "Enter a password to continue. This password will secure your system." )"
        userpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert a password for your computer." )" )"
    fi

    # request valid chars {{{
    for i in $(seq 6)
    do
        if printf "%s" "$userpass" | grep -qs '\\' ; then
            $guitool --error --text="$( eval_gettext "You cannot use the slash character, use a different password" )"" (\\)."
            userpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert a password for your computer." )" )"
        fi

        if printf "%s" "$userpass" | grep -qs -- "-" ; then
            $guitool --error --text="$( eval_gettext "You cannot use this character, use a different password:" )"" (-)."
            userpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert a password for your computer." )" )"
        fi

        if printf "%s" "$userpass" | grep -qs "'" ; then
            $guitool --error --text="$( eval_gettext "You cannot use quotes. Choose a different password." )"" (')."
            userpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert a password for your computer." )" )"
        fi

        if printf "%s" "$userpass" | grep -qs '`' ; then
            $guitool --error --text="$( eval_gettext "You cannot use quotes. Choose a different password." )"" (\`)."
            userpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert a password for your computer." )" )"
        fi

        if printf "%s" "$userpass" | grep -qs '"' ; then
            $guitool --error --text="$( eval_gettext "You cannot use the double-quote character, use a different password" )"" (\")."
            userpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert a password for your computer." )" )"
        fi
    done
}

###########################################################################
pass_step(){

    local translated_message
    translated_message="$( printf "$( eval_gettext "Insert a new password for user %s" )" "$username" )"

    userpass="$( $guitool --entry --hide-text --text="$translated_message" || echo cancel )"

    [[ "$userpass" = "cancel" ]] && exit 1

    repeatpass="$( $guitool --entry --hide-text --text="$( eval_gettext "Insert it again for confirmation" )" || echo cancel )"
    if [[ "$repeatpass" = "cancel" ]] || [[ -z "$repeatpass" ]] ; then
        $guitool --error
        exit 1
    fi


    #userpass="$( echo "$userpass" | sed "s|'|'\\\''|g" )"
    #repeatpass="$( echo "$repeatpass" | sed "s|'|'\\\''|g" )"

    pass_verify
}

###########################################################################
groups_add(){
    local group

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi


    # TODO: add this to the installer too
    for group in $( debconf-get-selections | grep "^user-setup" | grep "passwd/user-default-groups" | sed 's|^.*passwd/user-default-groups[[:blank:]]*string||g' )
    do
        # remove extra leading blank chars
        read -r group <<< "$group"

        "$ADDUSER" -q "$username" "${group}" 1>/dev/null 2>&1 || true
    done

}

###########################################################################
groups_del(){
    local group

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi


    for group in $( debconf-get-selections | grep "^user-setup" | grep "passwd/user-default-groups" | sed 's|^.*passwd/user-default-groups[[:blank:]]*string||g' )
    do
        # remove extra leading blank chars
        read -r group <<< "$group"

        $DELUSER "$username" "${group}" 1>/dev/null 2>&1 || true
    done
}

sudoers_user_generic(){
    local username mode
    mode="$1"
    shift
    username="$1"
    shift

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi

    # always delete first
    rm -f "/etc/sudoers.d/sudo_nopasswd_generic_${username}" 2>/dev/null || true

    case "$mode" in
        add)
            # network privileges
            echo -e "# User should always have access to rfkill and ifconfig, elive has an unblock wifi feature in desktop startup that requires it too\n${username}   ALL=(ALL) NOPASSWD: /sbin/ifconfig\n${username}   ALL=(ALL) NOPASSWD: /usr/sbin/rfkill\n" >> "/etc/sudoers.d/sudo_nopasswd_generic_${username}"

            # elive upgrader privileges
            echo -e "# We don't want to ask for admin password in every security update needed of the system\n${username}   ALL=(ALL) NOPASSWD: /usr/sbin/elive-upgrader-root\n" >> "/etc/sudoers.d/sudo_nopasswd_generic_${username}"

            # brightness control
            echo -e "# User should always be able to change the brightness of the screen\n${username}   ALL=(ALL) NOPASSWD: /usr/bin/brightnessctl\n" >> "/etc/sudoers.d/sudo_nopasswd_generic_${username}"

            # profile-sync-daemon
            echo -e "# profile-sync-daemon which is needed for the browsers requires privileges\n${username}   ALL=(ALL) NOPASSWD: /usr/bin/psd-overlay-helper\n" >> "/etc/sudoers.d/sudo_nopasswd_generic_${username}"

            # permissions
            chmod 0440 "/etc/sudoers.d/sudo_nopasswd_generic_${username}"
            ;;
    esac
}
sudoers_user_power(){
    local username mode
    mode="$1"
    shift
    username="$1"
    shift

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi

    # always delete first
    rm -f "/etc/sudoers.d/sudo_nopasswd_power_${username}" 2>/dev/null || true

    case "$mode" in
        add)
            echo "$username ALL=(ALL) NOPASSWD: /sbin/halt" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /sbin/shutdown" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /sbin/poweroff" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /sbin/reboot" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/pm-hibernate" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend-hybrid" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/hibernate-from-file" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/openrc-shutdown" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/powertop" >> "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            chmod 0440 "/etc/sudoers.d/sudo_nopasswd_power_${username}"
            ;;
    esac
}
sudoers_user_apt(){
    local username mode
    mode="$1"
    shift
    username="$1"
    shift

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi

    # always delete first
    rm -f "/etc/sudoers.d/sudo_nopasswd_packagers_${username}" 2>/dev/null || true

    case "$mode" in
        add)
            echo "$username ALL=(ALL) NOPASSWD: /usr/bin/apt" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/local/bin/apt" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/bin/apt-get" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/local/bin/apt-get" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/bin/apt-cache" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/bin/dpkg" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/bin/aptitude" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            echo "$username ALL=(ALL) NOPASSWD: /usr/sbin/synaptic" >> "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            chmod 0440 "/etc/sudoers.d/sudo_nopasswd_packagers_${username}"
            ;;
    esac
}
sudoers_user_nopass(){
    local username mode
    mode="$1"
    shift
    username="$1"
    shift

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi

    # always delete first
    rm -f "/etc/sudoers.d/sudo_nopasswd_all_${username}" 2>/dev/null || true

    case "$mode" in
        add)
            # add to group needed too
            "$ADDUSER" -q "$username" "sudo" 1>/dev/null || true

            echo "${username} ALL=(ALL) NOPASSWD: ALL" >> "/etc/sudoers.d/sudo_nopasswd_all_${username}"
            chmod 0440 "/etc/sudoers.d/sudo_nopasswd_all_${username}"
            ;;
    esac
}
sudoers_user(){
    local username mode
    mode="$1"
    shift
    username="$1"
    shift

    if [[ -z "$username" ]] ; then
        el_error "no username given"
        return 1
    fi

    # info:
    # ALL1 = (ALL2:ALL3) ALL4 means 1) users matched for this rule 2)hostnames allowed to run the following commands 3)users allowed to run the following commands 4) the commands allowed

    case "$mode" in
        add)
            # add to group
            "$ADDUSER" -q "$username" "sudo" 1>/dev/null || true
            ;;
        del)
            "$DELUSER" "$username" "sudo" 1>/dev/null 2>&1 || true
            ;;
    esac

    # default timeout value
    if ! grep -qs "Defaults:ALL timestamp_timeout=10" "/etc/sudoers.d/timeout_inmediate" ; then
        echo "Defaults:ALL timestamp_timeout=10" > "/etc/sudoers.d/timeout_inmediate"
        chmod 0440 "/etc/sudoers.d/timeout_inmediate"
    fi

    if ! grep -qsE "^%sudo\s+ALL=\(ALL:ALL\)\s+ALL$" /etc/sudoers ; then
        echo -e "\n# generic sudo group conf:" >> /etc/sudoers
        echo "%sudo   ALL=(ALL:ALL) ALL" >> /etc/sudoers
    fi

    # fix permissions
    chmod 0440 /etc/sudoers
}


###########################################################################
user_add(){
    local result want_autologin want_sudo want_sudo_apt user_shell

    #username="$( $guitool --entry --text="$( eval_gettext "Enter the name of the new user" )" || echo cancel )"
    #[[ "$username" = "cancel" ]] && exit 1

    if [[ -z "$username_real" ]] ; then
        username_real="John Smith"
    fi

    if ((is_sudo_wanted)) ; then
        want_sudo="TRUE"
    else
        want_sudo="FALSE"
    fi
    if ((is_autologin_wanted)) ; then
        want_autologin="TRUE"
    else
        want_autologin="FALSE"
    fi
    if ((is_sudo_apt_wanted)) ; then
        want_sudo_apt="TRUE"
    else
        want_sudo_apt="FALSE"
    fi

    result="$( yad \
        --title "$( eval_gettext "New user" )" --center --form \
        --field="$( eval_gettext "Configure a new user" ):LBL" "" \
        --field=":LBL" "" \
        --field="$( eval_gettext "Username (no spaces, short)" )" "$username" \
        --field="$( eval_gettext "User's real name" )" "$username_real" \
        --field="$( eval_gettext "Email (for Gravatar)" )" "$user_email" \
        --field="$( eval_gettext "Password to use" ):H" "$password" \
        --field="$( eval_gettext "Password confirmation" ):H" "$password" \
        --field="$( eval_gettext "Auto-login to desktop" ):CHK" "$want_autologin" \
        --field="$( eval_gettext "Privileges to install packages" ):CHK" "$want_sudo_apt" \
        --field="$( eval_gettext "Grant admin (sudo) privileges (recommended)" ):CHK" "$want_sudo" \
        --field="$( eval_gettext "Grant admin, and never request the password (not recommended)" ):CHK" "FALSE" \
        || echo cancel )"

    if [[ "$result" = "cancel" ]] || [[ -z "$result" ]] ; then
        if ((is_force_request)) ; then
            $guitool --warning --text="$( eval_gettext "Create a new user to continue." )"
            # recursive
            $FUNCNAME "$@"
            return 0
        else
            exit 1
        fi
    fi

    username="$( echo "$result" | awk -v FS="|" '{print $3}' )"
    username_real="$( echo "$result" | awk -v FS="|" '{print $4}' )"
    user_email="$( echo "$result" | awk -v FS="|" '{print $5}' )"
    userpass="$( echo "$result" | awk -v FS="|" '{print $6}' )"
    repeatpass="$( echo "$result" | awk -v FS="|" '{print $7}' )"
    #repeatpass="$userpass"
    autologin="$( echo "$result" | awk -v FS="|" '{print $8}' )"
    activatesudoapt="$( echo "$result" | awk -v FS="|" '{print $9}' )"
    activatesudo="$( echo "$result" | awk -v FS="|" '{print $10}' )"
    activatesudonopass="$( echo "$result" | awk -v FS="|" '{print $11}' )"

    # verifications {{{
    if [[ -z "$username" ]] || [[ -z "$username_real" ]] || [[ -z "$userpass" ]] ; then
        $guitool --error --text="$( eval_gettext "Please enter all the needed information" )"
        # recursive
        $FUNCNAME "$@"
        return 0
    fi

    # clean outside spaces
    read -r username <<< "$username"
    read -r username_real <<< "$username_real"
    read -r userpass <<< "$userpass"
    read -r user_email <<< "$user_email"

    # username_bak="$username"
    # cleanup to valid username
    username="${username// /_}"
    # do not enable this, is buggy, also, lots of users may want to have an username with their non-ascii characters from other languages
    #username="${username//[![:alnum:]]/-}"

    # remove starting-slash from username, to avoid bugs!
    username="${username#-}"

    # remove non-ascii characters
    #username="$( echo "$username" | perl -p -e 's|[^[:ascii:]]||g' )"
    username="${username##+(-)}"
    username="${username%%+(-)}"

    if [[ -n "$answer" ]] && [[ "$username" != "$answer" ]] ; then
        answer="$( $guitool --entry --entry-text="$username" --text="$( eval_gettext "Warning: Invalid username due to the presence of invalid characters. It has been converted to this one instead. Please continue or choose another." )" )"
        verify_result "$answer"
        username="$answer"
        username="${username// /_}"
        username="${username//[![:alnum:]]/-}"
        if [[ -n "$answer" ]] && [[ "$username" != "$answer" ]] ; then
            local message_loginname
            message_loginname="$( printf "$( eval_gettext "Important: Your login name is %s" )" "$username" )"
            $guitool --info --text="$message_loginname"
        fi
    fi

    # fix chars for name of user too:
    username_real="${username_real#-}"

    if ! [[ -n "$username" ]] ; then
        $guitool --error --text="$( eval_gettext "Invalid username" )"
        exit 1
    fi


    if [[ -z "$userpass" ]] ; then
        $guitool --error --text="$( eval_gettext "Passwords should match; use the same one for both entries." )"
        # recursive
        $FUNCNAME "$@"
        return 0
    fi



    #if [[ "$username" = "eliveuser" ]] ; then
        #$guitool --error --text="$( eval_gettext "Username -eliveuser- is not accepted, use a different name" )"
        #exit 1
    #fi

    #pass_step
    pass_verify


    # }}}
    # this comes from /etc/adduser.conf
    if [[ "$USERGROUPS" = "yes" ]] ; then
        USERGROUP="$username"
        # do not create it or adduser will fail
        #groupadd $USERGROUP 2>"${temp_error}" || exit 1
    else
        USERGROUP="$USERS_GID"
    fi

    # create user
    #$USERADD -d "$DHOME/$username" -m -k /etc/skel -c "$username_real" -g "$USERGROUP" -s /bin/bash "$username" 2>"${temp_error}" || exit 1
    #$USERADD -m $username 2>/tmp/.errormessage || exit 1
    #$ADDUSER --force-badname --disabled-password --gecos "$username_real" --shell /bin/zsh "$username" 2>/tmp/.errormessage || exit 1
    #$ADDUSER --force-badname --disabled-password --gecos "$username_real" --shell /bin/zsh "$username" 2>/tmp/.errormessage || exit 1
    # update: adduser doesn't accepts names like Владимир
    el_debug "useradd -c \"$username_real\" -m \"$username\""

    if [[ -x "$(which zsh)" ]]; then
        user_shell="/bin/zsh"
    else
        user_shell="/bin/bash"
    fi

    # cleanup
    rm -f "${temp_error}"

    if ! useradd -c "$username_real" -m -s "/bin/zsh" "$username" 2>"$temp_error"  ; then
        $USERDEL -r "$username" 2>/dev/null 1>&2 || true
        $guitool --error --text="$( eval_gettext "Unable to create your user. Try using English characters only" ). $(cat "$temp_error" | sed -e 's|useradd: ||g' )"
        el_warning "Unable to create user: $(cat "$temp_error" )"
        return 1
    fi

    if [[ -s "$temp_error" ]] ; then
        el_error "$(cat "$temp_error" )"
        rm -f "${temp_error}"
    fi

    # create / fix the files too
    elive-skel newuser "$username"

    # set password
    if chpasswd -h 2>&1 | grep -iq md5 ; then
        chpassopt="-m"
    else
        chpassopt=""
    fi

    #echo "$username:$userpass" | chpasswd $chpassopt
    bash -c 'printf "%s:%s\\n" "$1" "$2" | chpasswd -m' -- "$username" "$userpass"

    #elive-skel user $username $USERGROUP 2>"${temp_error}" || exit 1

    groups_add

    #chown -R "$username:$USERGROUP" "$DHOME/$username"

    # sudo configuration
    # always apply these generic ones
    sudoers_user_generic "add" "$username"
    if ((is_sysvinit)) ; then
        sudoers_user_power "add" "$username"
    fi

    if [[ "$activatesudo" = "TRUE" ]] ; then
        sudoers_user "add" "$username"
    else
        sudoers_user "del" "$username"
    fi
    if [[ "$activatesudonopass" = "TRUE" ]] ; then
        sudoers_user_nopass "add" "$username"
    else
        sudoers_user_nopass "del" "$username"
    fi
    if [[ "$activatesudoapt" = "TRUE" ]] ; then
        sudoers_user_apt "add" "$username"
    else
        sudoers_user_apt "del" "$username"
    fi

    # import gnupg keys
    if [[ -d "/usr/share/elive-security" ]] ; then
        su -c "gpg --import /usr/share/elive-security/*.asc 1>/dev/null 2>&1 || true" "$username"
        su -c "gpg --import-ownertrust /usr/share/elive-security/otrust.txt 1>/dev/null 2>&1 || true" "$username"
        su -c "gpg --update-trustdb 1>/dev/null 2>&1 || true" "$username"
        sync
        su -c "killall gpg-agent 1>/dev/null 2>&1 || true" "$username"
    fi


    # fingerprint support
    if grep -qsi "fingerprint" /proc/bus/input/devices || lsusb | grep -qsi "Upek" ; then
        $guitool --info --text="$( eval_gettext "Your computer has a fingerprint reader, check the Elive Howtos to know how to enable login via fingerprint." )" || true
    fi
    # deprecated, we use e17-wizard startup now
    #su -c "/usr/share/user-manager/hooks/newuser-static.sh" "$username"
    #su -c "/usr/share/user-manager/hooks/newuser-dynamic.sh" "$username"

    # add a lightdm icon reference for the username for its login
    mkdir -p /var/lib/AccountsService/users

    # set the gravatar logo to the user or fallback to the elive logo
    if [[ -n "$user_email" ]] && [[ -x "$(which wget)" ]] && el_verify_internet ; then
        mkdir -p "$DHOME/${username}/.config/elive"
        chown "${username}:${username}" "$DHOME/${username}/.config/elive"
        gravatar_id="$( echo -n "$user_email" | md5sum | awk '{print $1}' )"

        # this can be slow so we don't want / need to wait
        (
            wget -q "https://www.gravatar.com/avatar/${gravatar_id}.png?s=256&d=https%3A%2F%2Fwww.elivecd.org%2Fwp-content%2Fuploads%2Flogo-elive.png" -O "$DHOME/${username}/.config/elive/user-logo.png"
            chown "${username}:${username}" "$DHOME/${username}/.config/elive/user-logo.png"
        ) &
    fi

    # set a default logo for the user
    if [[ -s "${DHOME}/${username}/.config/elive/user-logo.png" ]] ; then
        echo -e "[User]\nIcon=${DHOME}/${username}/.config/elive/user-logo.png" > "/var/lib/AccountsService/users/$username"
    else
        echo -e "[User]\nIcon=/usr/share/icons/gnome/256x256/apps/logo-elive.png" > "/var/lib/AccountsService/users/$username"
    fi

    # set autologin
    if [[ "$autologin" = "TRUE" ]] ; then
        sed -i -e "s|^\(#\)*autologin-user=.*$|autologin-user=$username|g" "/etc/lightdm/lightdm.conf" 2>/dev/null || true
    fi

    local translated_message
    translated_message="$( printf "$( eval_gettext "User %s has been successfully added. You can use it now." )" "$username" )"

    # useful output result to fetch from a wrapper tool (like the installer)
    # required for: post-configuration of $username - configure root password as the same as the user if no system password has been set
    if ((is_show_output_wanted)) ; then
        echo "username=\"$username\""
        echo "user_email=\"$user_email\""
        echo "user_password=\"$userpass\""
        echo "autologin=\"${autologin}\""
    fi

    if ! ((is_quiet)) ; then
        $guitool --info --text="$translated_message" || true
    fi
}

###########################################################################
user_del(){
    local uid user userlist line pid processes

    while read -ru 3 line
    do
        uid="$( echo "$line" | awk -v FS=":" '{print $3}' )"
        user="$( echo "$line" | awk -v FS=":" '{print $1}' )"

        if [[ "${uid}" -ge "$FIRST_UID" ]] && [[ "${uid}" -le "$LAST_UID" ]] ; then
            if [[ -d "$DHOME/$user" ]] ; then
                userlist+=("$user")
            fi
        fi
    done 3<<< "$( cat "/etc/passwd" )"


    username="$( echo "${userlist[@]}" | tr ' ' '\n' | $guitool --list --column="$( eval_gettext "User" )" --text="$( eval_gettext "Select the user that you want to remove" )" || echo cancel )"

    if [[ "$username" = "cancel" ]] || [[ -z "$username" ]] ; then
        $guitool --error
        exit 1
    fi


    local translated_message
    translated_message="$( printf "$( eval_gettext "Are you sure to want to delete the user %s?" )" "$username" )"

    $guitool --question --text="$translated_message" || exit 1

    groups_del


    local translated_message
    translated_message="$( printf "$( eval_gettext "Do you wish to remove all %s files of the %s user?" )" "$DHOME/$username" "$username" )"

    # before to delete an user, all the processes needs to be closed or it will fail
    #for i in 1 2 3 4 5
    #do
        #while read -ru 3 pid
        #do
            #kill "$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true
        #done 3<<< "$( LC_ALL="$EL_LC_EN" ps aux | grep -E "^${username}\s+" | awk '{print $2}' )"
    #done
    killall -u "${username}" || true
    killall -u "${username}" || true
    killall -u "${username}" -9 || true
    # show if any remaining process:
    processes="$( ps h -u "${username}" || true )"
    if [[ -n "$processes" ]] ; then
        el_warning "posible remaining processes:\n$processes"
    fi

    if $guitool --question --text="$translated_message" ; then
        $USERDEL -r "$username" 2>"${temp_error}" || exit 1
    else
        $USERDEL "$username" 2>"${temp_error}" || exit 1
    fi

    # remove possible sudo configurations
    sudoers_user "del" "$username"
    sudoers_user_apt "del" "$username"
    sudoers_user_nopass "del" "$username"
    sudoers_user_power "del" "$username"
    sudoers_user_generic "del" "$username"

    local translated_message
    translated_message="$( printf "$( eval_gettext "User %s has been successfully removed." )" "$username" )"

    $guitool --info --text="$translated_message" || true

}

###########################################################################
pass_change(){
    local uid user userlist line

    while read -ru 3 line
    do
        uid="$( echo "$line" | awk -v FS=":" '{print $3}' )"
        user="$( echo "$line" | awk -v FS=":" '{print $1}' )"

        if [[ "${uid}" -ge "$FIRST_UID" ]] && [[ "${uid}" -le "$LAST_UID" ]] ; then
            if [[ -d "$DHOME/$user" ]] ; then
                userlist+=("$user")
            fi
        fi
    done 3<<< "$( cat "/etc/passwd" )"


    username="$( echo "root ${userlist[*]}" | tr ' ' '\n' | $guitool --list --column="$( eval_gettext "User" )" --text="$( eval_gettext "Select the user to change its password" )" || echo cancel )"
    if [[ "$username" = "cancel" ]] || [[ -z "$username" ]] ; then
        $guitool --error
        exit 1
    fi


    pass_step
    if chpasswd -h 2>&1 | grep -iq md5 ; then
        chpassopt="-m"
    else
        chpassopt=""
    fi

    #echo "$username:$userpass" | chpasswd $chpassopt
    bash -c 'printf "%s:%s\\n" "$1" "$2" | chpasswd -m' -- "$username" "$userpass"

    $guitool --info --text="$( eval_gettext "New password changed" )" || true

    exit
}

###########################################################################
autologin_conf(){
    local uid user userlist line

    local message_disable_autologin
    message_disable_autologin="$( printf "$( eval_gettext "Disable auto-login" )" "" )"

    while read -ru 3 line
    do
        uid="$( echo "$line" | awk -v FS=":" '{print $3}' )"
        user="$( echo "$line" | awk -v FS=":" '{print $1}' )"

        if [[ "${uid}" -ge "$FIRST_UID" ]] && [[ "${uid}" -le "$LAST_UID" ]] ; then
            if [[ -d "$DHOME/$user" ]] ; then
                userlist+=("$user")
            fi
        fi
    done 3<<< "$( cat "/etc/passwd" )"


    if [[ -z "$username" ]] ; then
        username="$( { echo "$message_disable_autologin" ; echo "${userlist[@]}" | tr ' ' '\n' ; } | $guitool --list --column="$( eval_gettext "User" )" --text="$( eval_gettext "Select the user that you want to log in with automatically." )" || echo cancel )"
    fi

    # note: instead of check for a translated "disable", just check if the user exists (which stills valid)
    if [[ -z "$username" ]] || [[ "$username" = "cancel" ]] || ! cat /etc/passwd | awk -v FS=":" '{print $1}' | grep -qs "^${username}$" ; then
        sed -i -e 's|^\(autologin-user=.*\)|#\1|g' "/etc/lightdm/lightdm.conf" || true
        $guitool --info --text="$( eval_gettext "Auto-login disabled" )" || true
    else
        # enable autologin for user
        sed -i -e "s|^\(#\)*autologin-user=.*$|autologin-user=$username|g" "/etc/lightdm/lightdm.conf"

        local message_autologin_set
        message_autologin_set="$( printf "$( eval_gettext "Auto-login set for %s" )" "$username" )"

        $guitool --info --text="$message_autologin_set" || true
    fi

    exit 0
}

###########################################################################
main(){
    local selection arg

    if [[ "$UID" != 0 ]] ; then
        $guitool --error --text="$( eval_gettext "This tool needs to be run with administrator privileges." )"
        exit
    fi

    for arg in "$@"
    do
        case "$arg" in
            --user-add|--user-del|--user-change|--autologin-conf)
                selection="$arg"
                shift
                ;;
            --user-sudo-generic-add=*)
                username="${arg#--user-sudo-generic-add=}"
                selection="--user-sudo-generic-add"
                shift
                ;;
            --user-sudo-apt-add=*)
                username="${arg#--user-sudo-apt-add=}"
                selection="--user-sudo-apt-add"
                shift
                ;;
            --quiet|-q)
                is_quiet=1
                shift
                ;;
            --user=*)
                username="${arg#--user=}"
                shift
                ;;
            --password=*)
                password="${arg#--password=}"
                shift
                ;;
            --show-output)
                is_show_output_wanted=1
                shift
                ;;
            --want-sudo)
                is_sudo_wanted=1
                shift
                ;;
            --want-sudo-apt)
                is_sudo_apt_wanted=1
                shift
                ;;
            --want-autologin)
                is_autologin_wanted=1
                shift
                ;;
            --email=*)
                user_email="${arg#--email=}"
                shift
                ;;
            --force-request)
                is_force_request=1
                shift
                ;;
        esac
    done


    if [[ -z "$selection" ]] ;then
        selection="$( $guitool --width=400 --height=280 --list --text="$( eval_gettext "Select an option" )" --column='' --column="$( eval_gettext "Option" )" '1' "$( eval_gettext "Add a new user" )" '2' "$( eval_gettext "Delete a user" )" '3' "$( eval_gettext "Change the password of a user" )" '4' "$( eval_gettext "Automated login configuration" )" || echo cancel )"
    fi

    case "$selection" in
        cancel)
            exit 1
            ;;
        1|--user-add)
            user_add "$username"
            ;;
        2|--user-del)
            user_del "$username"
            ;;
        3|--user-change)
            pass_change "$username"
            ;;
        4|--autologin-conf)
            autologin_conf "$username"
            ;;
        --user-sudo-generic-add)
            sudoers_user_generic "add" "$username"
            if ((is_sysvinit)) ; then
                sudoers_user_power "add" "$username"
            fi
            ;;
        --user-sudo-apt-add)
            sudoers_user_apt "add" "$username"
            ;;
    esac

    #[[ "$selection" = "cancel" ]] && exit 1
    #[[ "$selection" = "1" ]] && { user_add ; exit 0 ; }
    #[[ "$selection" = "2" ]] && { user_del ; exit 0 ; }
    #[[ "$selection" = "3" ]] && { pass_change ; exit 0 ; }
    #[[ "$selection" = "4" ]] && { autologin_conf ; exit 0 ; }

    rm -f "${temp_error}"
}

############ main

main "$@"



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


