From e6adb8a98209552ed81a095a0d13f7afa73112a9 Mon Sep 17 00:00:00 2001 From: Eric Hameleers Date: Thu, 30 Apr 2020 22:22:15 +0200 Subject: setup2hd: allow custom UidNumber during user account creation Do not assume 1000 is a good default for UidNumber in all cases - it may already have been taken. Instead, find the first free number above 999. --- SeTuacct.tpl | 143 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 59 deletions(-) diff --git a/SeTuacct.tpl b/SeTuacct.tpl index 017afaa..5024f5d 100755 --- a/SeTuacct.tpl +++ b/SeTuacct.tpl @@ -5,63 +5,88 @@ if [ ! -d $TMP ]; then mkdir -p $TMP fi - UFULLNAME="" - UACCOUNT="" - USHELL="/bin/bash" - UFORM="Fill out your user details:" - while [ 0 ]; do - dialog --stdout --ok-label "Submit" --no-cancel \ - --title "@UDISTRO@ (@LIVEDE@) USER CREATION" \ - --form "$UFORM" \ - 10 64 0 \ - "Full Name:" 1 1 "$UFULLNAME" 1 14 40 0 \ - "Logonname:" 2 1 "$UACCOUNT" 2 14 32 0 \ - "Login Shell:" 3 1 "$USHELL" 3 14 12 0 \ - 2>&1 1> $TMP/tempresult - iii=0 - declare -a USERATTR - while read LINE ; do - USERATTR[$iii]="$LINE" - iii=$(expr $iii + 1) - done < $TMP/tempresult - rm -f $TMP/tempresult - UFULLNAME="${USERATTR[0]}" - UACCOUNT="${USERATTR[1]}" - USHELL="${USERATTR[2]}" - unset USERATTR - UINPUT=0 - # Validate the input: - UACC_INVALID1="$(echo ${UACCOUNT:0:1} |tr -d 'a-z_')" - UACC_INVALID="$(echo ${UACCOUNT:1} |tr -d 'a-z0-9_-')" - if [ -n "$UACC_INVALID1" -o -n "$UACC_INVALID" ]; then - # User account contains invalid characters, let's remove them all: - UINPUT=1 - UACCOUNT="$(echo ${UACCOUNT} |tr -cd 'a-z_')" - fi - if [ -z "$UACCOUNT" -o -z "$UFULLNAME" ]; then - # User account or fullname is empty, let's try again: - UINPUT=$(expr $UINPUT + 2) - fi - if ! grep -q ${USHELL} ${T_PX}/etc/shells ; then - # Login shell is invalid, suggest the bash shell again: - UINPUT=$(expr $UINPUT + 4) - USHELL=/bin/bash - fi - if [ $UINPUT -eq 0 ]; then - break - elif [ $UINPUT -eq 1 ]; then - UFORM="Please only use valid characters for logonname" - elif [ $UINPUT -eq 2 ]; then - UFORM="Please enter your logon and full name" - elif [ $UINPUT -eq 3 ]; then - UFORM="Use valid characters for logonname, and enter full name" - elif [ $UINPUT -eq 4 ]; then - UFORM="Please enter a valid shell" - else - UFORM="Fill all fields, and only use valid characters for logonname" - fi - done +freeuid() { + # Get the first free UIDNumber after 999: + local UIDS=$( cat ${T_PX}/etc/passwd | cut -d: -f3 | sort -n ) + local UID=999 + while true; do + UID=$(( $UID + 1)) + if ! echo $UIDS | grep -F -q -w "$UID"; then + break; + fi + done + echo $UID +} +FREEUID="$(freeuid)" - echo "UACCOUNT=$UACCOUNT" - echo "UFULLNAME='$UFULLNAME'" - echo "USHELL=$USHELL" +UFULLNAME="" +UACCOUNT="" +UACCTNR="$FREEUID" +USHELL="/bin/bash" +UFORM="Fill out your user details:" +while [ 0 ]; do + dialog --stdout --ok-label "Submit" --no-cancel \ + --title "@UDISTRO@ (@LIVEDE@) USER CREATION" \ + --form "$UFORM" \ + 11 64 0 \ + "Full Name:" 1 1 "$UFULLNAME" 1 14 40 0 \ + "Logonname:" 2 1 "$UACCOUNT" 2 14 32 0 \ + "UIDNumber:" 3 1 "$UACCTNR" 3 14 12 0 \ + "Login Shell:" 4 1 "$USHELL" 4 14 12 0 \ + 2>&1 1> $TMP/tempresult + iii=0 + declare -a USERATTR + while read LINE ; do + USERATTR[$iii]="$LINE" + iii=$(expr $iii + 1) + done < $TMP/tempresult + rm -f $TMP/tempresult + UFULLNAME="${USERATTR[0]}" + UACCOUNT="${USERATTR[1]}" + UACCTNR="${USERATTR[2]}" + USHELL="${USERATTR[3]}" + unset USERATTR + UINPUT=0 + # Validate the input: + UACC_INVALID1="$(echo ${UACCOUNT:0:1} |tr -d 'a-z_')" + UACC_INVALID="$(echo ${UACCOUNT:1} |tr -d 'a-z0-9_-')" + if [ -n "$UACC_INVALID1" -o -n "$UACC_INVALID" ]; then + # User account contains invalid characters, let's remove them all: + UINPUT=1 + UACCOUNT="$(echo ${UACCOUNT} |tr -cd 'a-z_')" + fi + if [ -z "$UACCOUNT" -o -z "$UFULLNAME" ]; then + # User account or fullname is empty, let's try again: + UINPUT=$(expr $UINPUT + 2) + fi + if chroot ${T_PX} /usr/bin/id -u ${UACCTNR} 1>/dev/null 2>/dev/null ; then + # UidNumber is already in use, fall back to sane default: + UINPUT=$(expr $UINPUT + 4) + UACCTNR=$FREEUID + fi + if ! grep -q ${USHELL} ${T_PX}/etc/shells ; then + # Login shell is invalid, suggest the bash shell again: + UINPUT=$(expr $UINPUT + 8) + USHELL=/bin/bash + fi + if [ $UINPUT -eq 0 ]; then + break + elif [ $UINPUT -eq 1 ]; then + UFORM="Please only use valid characters for logonname" + elif [ $UINPUT -eq 2 ]; then + UFORM="Please enter your logon and full name" + elif [ $UINPUT -eq 3 ]; then + UFORM="Use valid characters for logonname, and enter full name" + elif [ $UINPUT -eq 4 ]; then + UFORM="Enter unused number for your account, $FREEUID is a good default" + elif [ $UINPUT -eq 8 ]; then + UFORM="Please enter a valid shell" + else + UFORM="Fill all fields, using valid logonname/uidnumber values" + fi +done + +echo "UACCOUNT=$UACCOUNT" +echo "UFULLNAME='$UFULLNAME'" +echo "UACCTNR=$UACCTNR" +echo "USHELL=$USHELL" -- cgit v1.2.3