diff options
Diffstat (limited to 'usr.sbin/bsdconfig/usermgmt/share/user_input.subr')
-rw-r--r-- | usr.sbin/bsdconfig/usermgmt/share/user_input.subr | 1345 |
1 files changed, 829 insertions, 516 deletions
diff --git a/usr.sbin/bsdconfig/usermgmt/share/user_input.subr b/usr.sbin/bsdconfig/usermgmt/share/user_input.subr index c95685c..39578c8 100644 --- a/usr.sbin/bsdconfig/usermgmt/share/user_input.subr +++ b/usr.sbin/bsdconfig/usermgmt/share/user_input.subr @@ -1,7 +1,7 @@ if [ ! "$_USERMGMT_USER_INPUT_SUBR" ]; then _USERMGMT_USER_INPUT_SUBR=1 # # Copyright (c) 2012 Ron McDowell -# Copyright (c) 2012-2013 Devin Teske +# Copyright (c) 2012-2014 Devin Teske # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -48,39 +48,57 @@ f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr ############################################################ FUNCTIONS -# f_get_member_groups $user +# f_get_member_groups $var_to_set $user # # Get a list of additional groups $user is a member of in group(5). # f_get_member_groups() { - echo $( pw groupshow -a | awk -F: "/[:,]$1(,|\$)/{print \$1}" ) + f_replaceall "$( pw groupshow -a | awk -F: -v user="$2" '{ + if (!split($4, users, /,/)) next + for (u in users) if (users[u] == user) { print $1; next } + }' )" "[$NL]" "," "$1" } # f_input_user $user # -# Given $user name or id, create the environment variables pw_name, pw_uid, -# pw_gid, pw_class, pw_password_expire, pw_account_expire, pw_gecos, -# pw_home_dir, pw_shell, and pw_member_groups (and pw_password is reset to -# NULL). +# Given $user name or id, create the environment variables user_name, user_uid, +# user_gid, user_class, user_password_expire, user_account_expire, user_gecos, +# user_home_dir, user_shell, and user_member_groups (and user_password is reset +# to NULL). # f_input_user() { + local funcname=f_input_user local user="$1" - eval $( pw usershow "$user" | awk -F: ' + + f_dprintf "$funcname: Getting info for user \`%s'" "$user" + eval "$( pw usershow "$user" 2> /dev/null | awk -F: ' + function set_value(var, value) { + gsub(/'\''/, "'\''\\'\'\''", value) + printf "user_%s='\'%s\''\n", var, value + } { - printf "pw_name='\'%s\''\n", $1 - printf "pw_password=\n" - printf "pw_uid='\'%s\''\n", $3 - printf "pw_gid='\'%s\''\n", $4 - printf "pw_class='\'%s\''\n", $5 - printf "pw_password_expire='\'%s\''\n", $6 - printf "pw_account_expire='\'%s\''\n", $7 - printf "pw_gecos='\'%s\''\n", $8 - printf "pw_home_dir='\'%s\''\n", $9 - printf "pw_shell='\'%s\''\n", $10 - }' ) - pw_member_groups=$( f_get_member_groups "$user" ) + found = $1 != "" + set_value("name", $1 ) + set_value("password", "" ) + set_value("uid", $3 ) + set_value("gid", $4 ) + set_value("class", $5 ) + set_value("password_expire", $6 ) + set_value("account_expire", $7 ) + set_value("gecos", $8 ) + set_value("home_dir", $9 ) + set_value("shell", $10) + exit + } + END { if (!found) print "false" }' )" + local retval=$? + + f_dprintf "$funcname: Getting group memberships for user \`%s'" "$user" + f_get_member_groups user_member_groups "$user" + + return $retval } # f_dialog_menu_user_list [$default] @@ -99,10 +117,13 @@ f_dialog_menu_user_list() # Add users from passwd(5) menu_list="$menu_list $( pw usershow -a | awk -F: ' - !/^[[:space:]]*(#|$)/ { - printf "'\'%s\'\ \'%s\''\n", $1, $8 - }' - )" + function mprint(tag, item) { + gsub(/'\''/, "'\''\\'\'\''", tag) + gsub(/'\''/, "'\''\\'\'\''", item) + printf "'\'%s\'\ \'%s\''\n", tag, item + } + !/^[[:space:]]*(#|$)/ { mprint($1, $8) } + ' )" local height width rows eval f_dialog_menu_size height width rows \ @@ -130,760 +151,710 @@ f_dialog_menu_user_list() return $retval } -# f_dialog_input_member_groups [$member_groups] +# f_dialog_input_member_groups $var_to_set [$member_groups] # # Allows the user to edit group memberships for a given user. If the user does -# not cancel or press ESC, the $pw_member_groups variable will hold the newly- +# not cancel or press ESC, the $var_to_set variable will hold the newly- # configured value upon return. # f_dialog_input_member_groups() { - local _member_groups="$1" - local prompt="$msg_member_of_groups" - local check_list= # Calculated below - local hline="$hline_alnum_space_tab_enter" - local group + local __var_to_set="$1" __input="$2" + local __prompt="$msg_member_of_groups" + local __menu_list=" + 'X' '$msg_continue' + '1' '$msg_select_groups_from_list' + '2' '$msg_enter_groups_manually' + " # END-QUOTE + local __defaultitem= + local __hline="$hline_alnum_space_tab_enter" - # - # Generate the checklist menu - # - for group in $( - pw groupshow -a | awk -F: '!/^[[:space:]]*(#|$)/{print $1}' - ); do - # Format of a checklist menu entry is "tag item status" - # (setting both tag and item to the group name below). - if echo "$_member_groups" | grep -q "\<$group\>"; then - check_list="$check_list $group $group on" - else - check_list="$check_list $group $group off" - fi - done + local __mheight __mwidth __mrows + eval f_dialog_menu_size __mheight __mwidth __mrows \ + \"\$DIALOG_TITLE\" \ + \"\$DIALOG_BACKTITLE\" \ + \"\$__prompt\" \ + \"\$__hline\" \ + $__menu_list - # - # Loop until the user provides taint-free/valid input - # - local height width rows + local __menu_choice __retval while :; do - eval f_dialog_checklist_size height width rows \ - \"\$DIALOG_TITLE\" \ - \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $check_list - _member_groups=$( eval $DIALOG \ + __menu_choice=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --separate-output \ - --hline \"\$hline\" \ + --hline \"\$__hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --checklist \"\$prompt\" \ - $height $width $rows \ - $check_list \ + --default-item \"\$__defaultitem\" \ + --menu \"\$__prompt\" \ + $__mheight $__mwidth $__mrows \ + $__menu_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || return $? - # Return if user either pressed ESC or chose Cancel/No - f_dialog_data_sanitize _member_groups - - # - # Validate each of the groups the user has entered - # - local all_groups_valid=1 - for group in $_member_groups; do - if ! f_quietly pw groupshow -n "$group"; then - f_show_msg "$msg_group_not_found" "$group" - all_groups_valid= - break - fi - done - [ "$all_groups_valid" ] || continue + ) + __retval=$? + f_dialog_data_sanitize __menu_choice + __defaultitem="$__menu_choice" + f_dprintf "retval=%u menu_choice=[%s]" \ + $__retval "$__menu_choice" - pw_member_groups="$_member_groups" - break - done - save_flag=1 + # Return if user has either pressed ESC or chosen Cancel/No + [ $__retval -eq $DIALOG_OK ] || return $__retval - f_dprintf "pw_member_groups: [%s]->[%s]" \ - "$cur_pw_member_groups" "$pw_member_groups" + local __member_groups + case "$__menu_choice" in + X) # Exit + break ;; + 1) # Select Groups from a list + local __check_list= # Calculated below + local __group_list __g __grp __length=0 + __group_list=$( pw groupshow -a | + awk -F: '!/^[[:space:]]*(#|$)/{print $1}' ) + while [ $__length -ne ${#__group_list} ]; do + __g="${__group_list%%$NL*}" # First line + f_shell_escape "$__g" __grp + + # Format of a checklist entry: tag item status + # NB: Setting both tag/item to group name below + __check_list="$__check_list '$__grp' '$__grp'" + case "$__input" in + "$__g"|"$__g",*|*,"$__g",*|*,"$__g") + __check_list="$__check_list on" ;; + *) + __check_list="$__check_list off" + esac + + __length=${#__group_list} + __group_list="${__group_list#*$NL}" # Kill line + done + + local __cheight __cwidth __crows + + eval f_dialog_checklist_size \ + __cheight __cwidth __crows \ + \"\$DIALOG_TITLE\" \ + \"\$DIALOG_BACKTITLE\" \ + \"\$__prompt\" \ + \"\$__hline\" \ + $__check_list + __member_groups=$( eval $DIALOG \ + --title \"\$DIALOG_TITLE\" \ + --backtitle \"\$DIALOG_BACKTITLE\" \ + --separate-output \ + --hline \"\$__hline\" \ + --ok-label \"\$msg_ok\" \ + --cancel-label \"\$msg_cancel\" \ + --checklist \"\$__prompt\" \ + $__cheight $__cwidth $__crows \ + $__check_list \ + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD + ) || continue + # Return to previous menu if user either + # pressed ESC or chose Cancel/No + f_dialog_data_sanitize __member_groups + + # + # Convert the newline separated list into a comma- + # separated one so that if the user switches over to + # manual editing, list reflects checklist selections + # + f_replaceall "$__member_groups" "[$NL]" "," __input + ;; + 2) # Enter Groups manually + local __prompt2="$msg_groups" + __prompt2="$__prompt2 ($msg_separated_by_commas)" + + f_dialog_input __member_groups \ + "$__prompt2" "$__input" \ + "$hline_num_tab_enter" || continue + # Return to previous menu if user either + # pressed ESC or chose Cancel/No + + # + # Validate each of the groups the user has entered + # + local __all_groups_valid=1 __grp __grp_list + f_replaceall "$__member_groups" "," " " __grp_list + for __grp in $__grp_list; do + if ! f_quietly pw groupshow -n "$__grp"; then + f_show_msg "$msg_group_not_found" \ + "$__grp" + __all_groups_valid= + break + fi + done + [ "$__all_groups_valid" ] || continue + + __input="$__member_groups" + ;; + esac + done + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_name [$name] +# f_dialog_input_name $var_to_set [$name] # # Allows the user to enter a new username for a given user. If the user does -# not cancel or press ESC, the $pw_name variable will hold the newly-configured -# value upon return. -# -# If $cur_pw_name is defined, the user can enter that and by-pass error- -# checking (allowing the user to "revert" to an old value without, for example, -# being told that the username already exists). +# not cancel or press ESC, the $var_to_set variable will hold the newly- +# configured value upon return. # f_dialog_input_name() { + local __var_to_set="$1" __name="$2" + # # Loop until the user provides taint-free/valid input # - local _name="$1" _input="$1" + local __input="$__name" while :; do - # Return if user has either pressed ESC or chosen Cancel/No - f_dialog_input _input "$msg_login" "$_input" \ + f_dialog_input __input "$msg_login" "$__input" \ "$hline_alnum_tab_enter" || return $? # Check for no-change - [ "$_input" = "$_name" ] && return $DIALOG_OK - - # Check for reversion - if [ "$_input" = "$cur_pw_name" ]; then - pw_name="$cur_pw_name" + if [ "$__input" = "$__name" ]; then + setvar "$__var_to_set" "$__input" return $DIALOG_OK fi # Check for NULL entry - if [ ! "$_input" ]; then + if [ ! "$__input" ]; then f_show_msg "$msg_login_is_empty" continue fi # Check for invalid entry - if ! echo "$_input" | grep -q "^[[:alpha:]]"; then + case "$__input" in [!a-zA-Z]*) f_show_msg "$msg_login_must_start_with_letter" continue - fi + esac # Check for duplicate entry - if f_quietly pw usershow -n "$_input"; then - f_show_msg "$msg_login_already_used" "$_input" + if f_quietly pw usershow -n "$__input"; then + f_show_msg "$msg_login_already_used" "$__input" continue fi - pw_name="$_input" + setvar "$__var_to_set" "$__input" break done - save_flag=1 - - f_dprintf "pw_name: [%s]->[%s]" "$cur_pw_name" "$pw_name" return $DIALOG_OK } -# f_dialog_input_password +# f_dialog_input_password $var_to_set $dvar_to_set # -# Prompt the user to enter a password (twice). +# Prompt the user to enter a password (twice). If the user does not cancel or +# press ESC, $var_to_set will hold the confirmed user entry. Otherwise, if the +# user cancels or enters a NULL password (twice), they are given the choice to +# disable password authentication for the given login, wherein $dvar_to_set has +# a value of 1 to indicate password authentication should be disabled. # f_dialog_input_password() { - local prompt1="$msg_password" - local prompt2="$msg_reenter_password" - local hline="$hline_alnum_punc_tab_enter" + local __var_to_set="$1" __dvar_to_set="$2" + local __prompt1="$msg_password" + local __prompt2="$msg_reenter_password" + local __hline="$hline_alnum_punc_tab_enter" - local height1 width1 - f_dialog_inputbox_size height1 width1 \ + local __height1 __width1 + f_dialog_inputbox_size __height1 __width1 \ "$DIALOG_TITLE" \ "$DIALOG_BACKTITLE" \ - "$prompt1" \ + "$__prompt1" \ "" \ - "$hline" - local height2 width2 - f_dialog_inputbox_size height2 width2 \ + "$__hline" + local __height2 __width2 + f_dialog_inputbox_size __height2 __width2 \ "$DIALOG_TITLE" \ "$DIALOG_BACKTITLE" \ - "$prompt2" \ + "$__prompt2" \ "" \ - "$hline" + "$__hline" # # Loop until the user provides taint-free/valid input # - local _password1 _password2 + local __retval __password1 __password2 while :; do - _password1=$( $DIALOG \ + __password1=$( $DIALOG \ --title "$DIALOG_TITLE" \ --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ + --hline "$__hline" \ --ok-label "$msg_ok" \ --cancel-label "$msg_cancel" \ --insecure \ - --passwordbox "$prompt1" \ - $height1 $width1 \ + --passwordbox "$__prompt1" \ + $__height1 $__width1 \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || return $? # Return if user either pressed ESC or chose Cancel/No - debug= f_dialog_line_sanitize _password1 + debug= f_dialog_line_sanitize __password1 - _password2=$( $DIALOG \ + __password2=$( $DIALOG \ --title "$DIALOG_TITLE" \ --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ + --hline "$__hline" \ --ok-label "$msg_ok" \ --cancel-label "$msg_cancel" \ --insecure \ - --passwordbox "$prompt2" \ - $height2 $width2 \ + --passwordbox "$__prompt2" \ + $__height2 $__width2 \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || return $? # Return if user either pressed ESC or chose Cancel/No - debug= f_dialog_line_sanitize _password2 + debug= f_dialog_line_sanitize __password2 # Check for password mismatch - if [ "$_password1" != "$_password2" ]; then + if [ "$__password1" != "$__password2" ]; then f_show_msg "$msg_passwords_do_not_match" continue fi # Check for NULL entry - if [ ! "$_password1" ]; then + if [ ! "$__password1" ]; then f_dialog_yesno "$msg_disable_password_auth_for_account" - local retval=$? - if [ $retval -eq $DIALOG_ESC ]; then - return $retval - elif [ $retval -eq $DIALOG_OK ]; then - pw_password_disable=1 + __retval=$? + if [ $__retval -eq $DIALOG_ESC ]; then + return $__retval + elif [ $__retval -eq $DIALOG_OK ]; then + setvar "$__dvar_to_set" 1 else continue # back to password prompt fi else - pw_password_disable= + setvar "$__dvar_to_set" "" fi - pw_password="$_password1" + setvar "$__var_to_set" "$__password1" break done - save_flag=1 - - f_dprintf "pw_password: [%s]->[%s]" "$cur_pw_password" "$pw_password" return $DIALOG_OK } -# f_dialog_input_gecos [$gecos] +# f_dialog_input_gecos $var_to_set [$gecos] # # Allow the user to enter new GECOS information for a given user. This # information is commonly used to store the ``Full Name'' of the user. If the -# user does not cancel or press ESC, the $pw_gecos variable will hold the +# user does not cancel or press ESC, the $var_to_set variable will hold the # newly-configured value upon return. # f_dialog_input_gecos() { - local _input="$1" + local __var_to_set="$1" __input="$2" # Return if user has either pressed ESC or chosen Cancel/No - f_dialog_input _input "$msg_full_name" "$_input" \ + f_dialog_input __input "$msg_full_name" "$__input" \ "$hline_alnum_punc_tab_enter" || return $? - pw_gecos="$_input" - save_flag=1 - - f_dprintf "pw_gecos: [%s]->[%s]" "$cur_pw_gecos" "$pw_gecos" - + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_uid [$uid] +# f_dialog_input_uid $var_to_set [$uid] # # Allow the user to enter a new UID for a given user. If the user does not -# cancel or press ESC, the $pw_uid variable will hold the newly-configured +# cancel or press ESC, the $var_to_set variable will hold the newly-configured # value upon return. # f_dialog_input_uid() { - local _input="$1" + local __var_to_set="$1" __input="$2" # Return if user has either pressed ESC or chosen Cancel/No - f_dialog_input _input "$msg_user_id_leave_empty_for_default" \ - "$_input" "$hline_num_tab_enter" || return $? - - pw_uid="$_input" - save_flag=1 - - f_dprintf "pw_uid: [%s]->[%s]" "$cur_pw_uid" "$pw_uid" + f_dialog_input __input "$msg_user_id_leave_empty_for_default" \ + "$__input" "$hline_num_tab_enter" || return $? + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_gid [$gid] +# f_dialog_input_gid $var_to_set [$gid] # # Allow the user to enter a new primary GID for a given user. If the user does -# not cancel or press ESC, the $pw_gid variable will hold the newly-configured -# value upon return. +# not cancel or press ESC, the $var_to_set variable will hold the newly- +# configured value upon return. # f_dialog_input_gid() { - local _input="$1" + local __var_to_set="$1" __input="$2" # Return if user has either pressed ESC or chosen Cancel/No - f_dialog_input _input "$msg_group_id_leave_empty_for_default" \ - "$_input" "$hline_num_tab_enter" || return $? - - pw_gid="$_input" - save_flag=1 - - f_dprintf "pw_gid: [%s]->[%s]" "$cur_pw_gid" "$pw_gid" + f_dialog_input __input "$msg_group_id_leave_empty_for_default" \ + "$__input" "$hline_num_tab_enter" || return $? + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_class [$class] +# f_dialog_input_class $var_to_set [$class] # # Allow the user to enter a new login class for a given user. If the user does -# not cancel or press ESC, the $pw_class variable will hold the newly- +# not cancel or press ESC, the $var_to_set variable will hold the newly- # configured value upon return. # f_dialog_input_class() { - local _input="$1" + local __var_to_set="$1" __input="$2" # Return if user has either pressed ESC or chosen Cancel/No - f_dialog_input _input "$msg_login_class" "$_input" \ + f_dialog_input __input "$msg_login_class" "$__input" \ "$hline_alnum_tab_enter" || return $? - pw_class="$_input" - save_flag=1 - - f_dprintf "pw_class: [%s]->[%s]" "$cur_pw_class" "$pw_class" - + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_expire_password [$seconds] +# f_dialog_input_expire_password $var_to_set [$seconds] # # Allow the user to enter a date/time (in number-of-seconds since the `epoch') # for when a given user's password must be changed. If the user does not cancel -# or press ESC, the $pw_password_expire variable will hold the newly- -# configured value upon return. +# or press ESC, the $var_to_set variable will hold the newly-configured value +# upon return. # f_dialog_input_expire_password() { - local prompt="$msg_password_expires_on" - local menu_list=" + local __var_to_set="$1" __input="$2" + local __prompt="$msg_password_expires_on" + local __menu_list=" '1' '$msg_password_does_not_expire' '2' '$msg_edit_date_time_with_a_calendar' - '3' '$msg_enter_number_of_days_into_the_future' - '4' '$msg_enter_value_manually' + '3' '$msg_enter_value_manually' " # END-QUOTE - local hline="$hline_num_arrows_tab_enter" - local retval _input="$1" + local __defaultitem= # Calculated below + local __hline="$hline_num_arrows_tab_enter" - local mheight mwidth mrows - eval f_dialog_menu_size mheight mwidth mrows \ + local __mheight __mwidth __mrows + eval f_dialog_menu_size __mheight __mwidth __mrows \ \"\$DIALOG_TITLE\" \ \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - local cheight cwidth - f_dialog_calendar_size cheight cwidth \ + \"\$__prompt\" \ + \"\$__hline\" \ + $__menu_list + local __cheight __cwidth + f_dialog_calendar_size __cheight __cwidth \ "$DIALOG_TITLE" \ "$DIALOG_BACKTITLE" \ - "$prompt" \ - "$hline" - local theight twidth - f_dialog_timebox_size theight twidth \ + "$__prompt" \ + "$__hline" + local __theight __twidth + f_dialog_timebox_size __theight __twidth \ "$DIALOG_TITLE" \ "$DIALOG_BACKTITLE" \ - "$prompt" \ - "$hline" + "$__prompt" \ + "$__hline" # # Loop until the user provides taint-free/cancellation-free input # - local date_type defaultitem= + local __retval __date_type while :; do - date_type=$( eval $DIALOG \ + __date_type=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --default-item \"\$defaultitem\" \ + --hline \"\$__hline\" \ + --default-item \"\$__defaultitem\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --menu \"\$prompt\" \ - $mheight $mwidth $mrows \ - $menu_list \ + --menu \"\$__prompt\" \ + $__mheight $__mwidth $__mrows \ + $__menu_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - f_dialog_data_sanitize date_type - defaultitem="$date_type" - f_dprintf "retval=%u date_type=[%s]" $retval "$date_type" + __retval=$? + f_dialog_data_sanitize __date_type + __defaultitem="$__date_type" + f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type" # Return if user has either pressed ESC or chosen Cancel/No - [ $retval -eq $DIALOG_OK ] || return $retval + [ $__retval -eq $DIALOG_OK ] || return $__retval - case "$date_type" in + case "$__date_type" in 1) # Password does not expire - _input="" - break ;; + __input= break ;; 2) # Edit date/time with a calendar - local _input_date _input_time ret_date ret_time + local __input_date __input_time __ret_date __ret_time - local secs="$_input" - { f_isinteger "$secs" && [ $secs -gt 0 ]; } || secs= - _input_date=$( date -j -f "%s" -- "$secs" \ + local __seconds="$__input" + { f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } || + __seconds= + __input_date=$( date -j -f "%s" -- "$__seconds" \ "+%d %m %Y" 2> /dev/null ) - ret_date=$( eval $DIALOG \ + __ret_date=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ + --hline \"\$__hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --calendar \"\$prompt\" \ - $cheight $cwidth \ - $_input_date \ + --calendar \"\$__prompt\" \ + $__cheight $__cwidth \ + $__input_date \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - f_dialog_data_sanitize ret_date - f_dprintf "retval=%u ret_date=[%s]" $retval "$ret_date" + __retval=$? + f_dialog_data_sanitize __ret_date + f_dprintf "retval=%u ret_date=[%s]" \ + $__retval "$__ret_date" # Return to menu if either ESC or Cancel/No - [ $retval -eq $DIALOG_OK ] || continue + [ $__retval -eq $DIALOG_OK ] || continue - _input_time= - [ "$secs" ] && _input_time=$( date -j \ - -f %s -- "$_input" "+%H %M %S" 2> /dev/null ) - ret_time=$( eval $DIALOG \ + __input_time= + [ "$__seconds" ] && __input_time=$( date -j \ + -f %s -- "$__input" "+%H %M %S" 2> /dev/null ) + __ret_time=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ + --hline \"\$__hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --timebox \"\$prompt\" \ - $theight $twidth \ - $_input_time \ + --timebox \"\$__prompt\" \ + $__theight $__twidth \ + $__input_time \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - f_dialog_data_sanitize ret_time - f_dprintf "retval=%u ret_time=[%s]" $retval "$ret_time" + __retval=$? + f_dialog_data_sanitize __ret_time + f_dprintf "retval=%u ret_time=[%s]" \ + $__retval "$__ret_time" # Return to menu if either ESC or Cancel/No - [ $retval -eq $DIALOG_OK ] || continue + [ $__retval -eq $DIALOG_OK ] || continue - _input=$( date \ - -j -f "%d/%m/%Y %T" \ - -- "$ret_date $ret_time" \ - +%s 2> /dev/null ) - f_dprintf "_input=[%s]" "$_input" + __input=$( date -j -f "%d/%m/%Y %T" -- \ + "$__ret_date $__ret_time" +%s 2> /dev/null ) + f_dprintf "input=[%s]" "$__input" break ;; - 3) # Enter number of days into the future - local ret_days seconds="$( date +%s )" - - f_isinteger "$_input" || _input=0 - [ $_input -gt 0 -a $_input -gt $seconds ] && - ret_days=$(( ( $_input - $seconds ) / 86400 )) - f_isinteger "$ret_days" && - ret_days=$(( $ret_days + 1 )) + 3) # Enter value manually + local __msg __new_input + f_sprintf __msg "$msg_password_expire_manual_edit" \ + "$( date -r 0 "+%c %Z" )" # Return to menu if either ESC or Cancel/No - f_dialog_input ret_days \ - "$msg_password_expires_in_how_many_days" \ - "$ret_days" "$hline" || continue - - # Taint-check the user's input - if ! f_isinteger "$ret_days"; then - f_show_msg "$msg_invalid_number_of_days" - continue - fi + f_dialog_input __new_input \ + "$__msg" "$__input" "$__hline" || continue - f_dprintf "ret_days=[%s]" "$ret_days" - case "$ret_days" in - [-+]*) _input=$( date -v${ret_days}d +%s ) ;; - 0) _input=$( date +%s ) ;; - *) _input=$( date -v+${ret_days}d +%s ) ;; - esac - f_dprintf "_input=[%s]" "$_input" - break ;; - - 4) # Enter value manually - local msg ret_secs - f_sprintf msg "$msg_number_of_seconds_since_epoch" \ - "$( date -r 1 "+%c %Z" )" - - # Return to menu if either ESC or Cancel/No - f_dialog_input ret_secs \ - "$msg" "$_input" "$hline" || continue - - _input="$ret_secs" - - # Taint-check the user's input - if ! f_isinteger "${_input:-0}"; then - f_show_msg "$msg_invalid_number_of_seconds" - continue - fi - - f_dprintf "_input=[%s]" "$_input" + __input="$__new_input" + f_dprintf "input=[%s]" "$__input" break ;; esac done # Loop forever - pw_password_expire="$_input" - save_flag=1 - - f_dprintf "pw_password_expire: [%s]->[%s]" \ - "$cur_pw_password_expire" "$pw_password_expire" - + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_expire_account [$seconds] +# f_dialog_input_expire_account $var_to_set [$seconds] # # Allow the user to enter a date/time (in number-of-seconds since the `epoch') # for when a given user's account should become expired. If the user does not -# cancel or press ESC, the $pw_account_expire variable will hold the newly- -# configured value upon return. +# cancel or press ESC, the $var_to_set variable will hold the newly-configured +# value upon return. # f_dialog_input_expire_account() { - local prompt="$msg_account_expires_on" - local menu_list=" + local __var_to_set="$1" __input="$2" + local __prompt="$msg_account_expires_on" + local __menu_list=" '1' '$msg_account_does_not_expire' '2' '$msg_edit_date_time_with_a_calendar' - '3' '$msg_enter_number_of_days_into_the_future' - '4' '$msg_enter_value_manually' + '3' '$msg_enter_value_manually' " # END-QUOTE - local hline="$hline_num_arrows_tab_enter" - local retval _input="$1" + local __defaultitem= # Calculated below + local __hline="$hline_num_arrows_tab_enter" - local mheight mwidth mrows - eval f_dialog_menu_size mheight mwidth mrows \ + local __mheight __mwidth __mrows + eval f_dialog_menu_size __mheight __mwidth __mrows \ \"\$DIALOG_TITLE\" \ \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - local cheight cwidth - f_dialog_calendar_size cheight cwidth \ + \"\$__prompt\" \ + \"\$__hline\" \ + $__menu_list + local __cheight __cwidth + f_dialog_calendar_size __cheight __cwidth \ "$DIALOG_TITLE" \ "$DIALOG_BACKTITLE" \ - "$prompt" \ - "$hline" - local theight twidth - f_dialog_timebox_size theight twidth \ + "$__prompt" \ + "$__hline" + local __theight __twidth + f_dialog_timebox_size __theight __twidth \ "$DIALOG_TITLE" \ "$DIALOG_BACKTITLE" \ - "$prompt" \ - "$hline" + "$__prompt" \ + "$__hline" # # Loop until the user provides taint-free/cancellation-free input # - local date_type defaultitem= + local __retval __date_type while :; do - date_type=$( eval $DIALOG \ + __date_type=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --default-item \"\$defaultitem\" \ + --hline \"\$__hline\" \ + --default-item \"\$__defaultitem\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --menu \"\$prompt\" \ - $mheight $mwidth $mrows \ - $menu_list \ + --menu \"\$__prompt\" \ + $__mheight $__mwidth $__mrows \ + $__menu_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - f_dialog_data_sanitize date_type - defaultitem="$date_type" - f_dprintf "retval=%u date_type=[%s]" $retval "$date_type" + __retval=$? + f_dialog_data_sanitize __date_type + __defaultitem="$__date_type" + f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type" # Return if user has either pressed ESC or chosen Cancel/No - [ $retval -eq $DIALOG_OK ] || return $retval + [ $__retval -eq $DIALOG_OK ] || return $__retval - case "$date_type" in + case "$__date_type" in 1) # Account does not expire - _input="" - break ;; + __input= break ;; 2) # Edit date/time with a calendar - local _input_date _input_time ret_date ret_time + local __input_date __input_time __ret_date __ret_time - local secs="$_input" - { f_isinteger "$secs" && [ $secs -gt 0 ]; } || secs= - _input_date=$( date -j -f "%s" -- "$secs" \ + local __seconds="$__input" + { f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } || + __seconds= + __input_date=$( date -j -f "%s" -- "$__seconds" \ "+%d %m %Y" 2> /dev/null ) - ret_date=$( eval $DIALOG \ + __ret_date=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ + --hline \"\$__hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --calendar \"\$prompt\" \ - $cheight $cwidth \ - $_input_date \ + --calendar \"\$__prompt\" \ + $__cheight $__cwidth \ + $__input_date \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - f_dialog_data_sanitize ret_date - f_dprintf "retval=%u ret_date=[%s]" $retval "$ret_date" + __retval=$? + f_dialog_data_sanitize __ret_date + f_dprintf "retval=%u ret_date=[%s]" \ + $__retval "$__ret_date" # Return to menu if either ESC or Cancel/No - [ $retval -eq $DIALOG_OK ] || continue + [ $__retval -eq $DIALOG_OK ] || continue - _input_time= - [ "$secs" ] && _input_time=$( date -j \ - -f %s -- "$_input" "+%H %M %S" 2> /dev/null ) - ret_time=$( eval $DIALOG \ + __input_time= + [ "$__seconds" ] && __input_time=$( date -j \ + -f %s -- "$__input" "+%H %M %S" 2> /dev/null ) + __ret_time=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ + --hline \"\$__hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --timebox \"\$prompt\" \ - $theight $twidth \ - $_input_time \ + --timebox \"\$__prompt\" \ + $__theight $__twidth \ + $__input_time \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - retval=$? - f_dialog_data_sanitize ret_time - f_dprintf "retval=%u ret_time=[%s]" $retval "$ret_time" - - # Return to menu if either ESC or Cancel/No - [ $retval -eq $DIALOG_OK ] || continue - - _input=$( date \ - -j -f "%d/%m/%Y %T" \ - -- "$ret_date $ret_time" \ - +%s 2> /dev/null ) - f_dprintf "_input=[%s]" "$_input" - break ;; - - 3) # Enter number of days into the future - local ret_days seconds="$( date +%s )" - - f_isinteger "$_input" || _input=0 - [ $_input -gt 0 -a $_input -gt $seconds ] && - ret_days=$(( ( $_input - $seconds ) / 86400 )) - f_isinteger "$ret_days" && - ret_days=$(( $ret_days + 1 )) + __retval=$? + f_dialog_data_sanitize __ret_time + f_dprintf "retval=%u ret_time=[%s]" \ + $__retval "$__ret_time" # Return to menu if either ESC or Cancel/No - f_dialog_input ret_days \ - "$msg_account_expires_in_how_many_days" \ - "$ret_days" "$hline" || continue - - # Taint-check the user's input - if ! f_isinteger "$ret_days"; then - f_show_msg "$msg_invalid_number_of_days" - continue - fi + [ $__retval -eq $DIALOG_OK ] || continue - f_dprintf "ret_days=[%s]" "$ret_days" - case "$ret_days" in - [-+]*) _input=$( date -v${ret_days}d +%s ) ;; - 0) _input=$( date +%s ) ;; - *) _input=$( date -v+${ret_days}d +%s ) ;; - esac - f_dprintf "_input=[%s]" "$_input" + __input=$( date -j -f "%d/%m/%Y %T" -- \ + "$ret_date $ret_time" +%s 2> /dev/null ) + f_dprintf "input=[%s]" "$__input" break ;; - 4) # Enter value manually - local msg ret_secs - f_sprintf msg "$msg_number_of_seconds_since_epoch" \ - "$( date -r 1 "+%c %Z" )" + 3) # Enter value manually + local __msg __new_input + f_sprintf __msg "$msg_account_expire_manual_edit" \ + "$( date -r 0 "+%c %Z" )" # Return to menu if either ESC or Cancel/No - f_dialog_input ret_secs "$msg" \ - "$_input" "$hline" || continue - - _input="$ret_secs" - - # Taint-check the user's input - if ! f_isinteger "${_input:-0}"; then - f_show_msg "$msg_invalid_number_of_seconds" - continue - fi + f_dialog_input __new_input \ + "$__msg" "$__input" "$__hline" || continue - f_dprintf "_input=[%s]" "$_input" + __input="$__new_input" + f_dprintf "input=[%s]" "$__input" break ;; esac done # Loop forever - pw_account_expire="$_input" - save_flag=1 - - f_dprintf "pw_account_expire: [%s]->[%s]" \ - "$cur_pw_account_expire" "$pw_account_expire" - + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_home_dir [$home_dir] +# f_dialog_input_home_dir $var_to_set [$home_dir] # -# Allow the user to enter a new home directory for a given user. If the user -# does not cancel or press ESC, the $pw_home_dir variable will hold the newly- +# Allow the user to enter a new home directory for a given login. If the user +# does not cancel or press ESC, the $var_to_set variable will hold the newly- # configured value upon return. # f_dialog_input_home_dir() { - local _input="$1" + local __var_to_set="$1" __input="$2" # Return if user has either pressed ESC or chosen Cancel/No - f_dialog_input _input "$msg_home_directory" "$_input" \ + f_dialog_input __input "$msg_home_directory" "$__input" \ "$hline_alnum_punc_tab_enter" || return $? - pw_home_dir="$_input" - save_flag=1 - - f_dprintf "pw_home_dir: [%s]->[%s]" "$cur_pw_home_dir" "$pw_home_dir" - + setvar "$__var_to_set" "$__input" return $DIALOG_OK } -# f_dialog_input_home_create +# f_dialog_input_home_create $var_to_set # -# Prompt the user to confirm creation of a given user's home directory. If the -# user does not cancel (by choosing "No") or press ESC, the $pw_home_create +# Prompt the user to confirm creation of a given login's home directory. If the +# user does not cancel (by choosing "No") or press ESC, the $var_to_set # variable will hold $msg_yes upon return, otherwise $msg_no. Use these return # variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible. # f_dialog_input_home_create() { - local retval + local __var_to_set="$1" f_dialog_yesno "$msg_create_home_directory" - retval=$? + local __retval=$? - if [ $retval -eq $DIALOG_OK ]; then - pw_home_create="$msg_yes" + if [ $__retval -eq $DIALOG_OK ]; then + setvar "$__var_to_set" "$msg_yes" else - pw_home_create="$msg_no" + setvar "$__var_to_set" "$msg_no" fi - save_flag=1 - f_dprintf "pw_home_create: [%s]->[%s]" \ - "$cur_pw_home_create" "$pw_home_create" - - [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC + [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC } -# f_dialog_input_group_delete +# f_dialog_input_group_delete $var_to_set [$group] # -# Prompt the user to confirm deletion of a given user's primary group. If the -# user does not cancel (by choosing "No") or press ESC, the $pw_group_delete +# Prompt the user to confirm deletion of a given login's primary group. If the +# user does not cancel (by choosing "No") or press ESC, the $var_to_set # variable will hold $msg_yes upon return, otherwise $msg_no. Use these return # variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible. # f_dialog_input_group_delete() { - local retval + local __var_to_set="$1" __group="$2" - if f_isinteger "$pw_gid"; then - if [ $pw_gid -lt 1000 ]; then + if f_isinteger "$__group"; then + if [ $__group -lt 1000 ]; then f_dialog_noyes "$msg_delete_primary_group" else f_dialog_yesno "$msg_delete_primary_group" fi - elif [ "$pw_gid" ]; then - local gid=0 - gid=$( pw groupshow "$pw_gid" | awk -F: '{print $3}' ) - if f_isinteger "$gid" && [ $gid -lt 1000 ]; then + elif [ "$__group" ]; then + local __gid=0 + __gid=$( pw groupshow "$__group" | awk -F: '{print $3}' ) + if f_isinteger "$__gid" && [ $__gid -lt 1000 ]; then f_dialog_noyes "$msg_delete_primary_group" else f_dialog_yesno "$msg_delete_primary_group" @@ -891,131 +862,473 @@ f_dialog_input_group_delete() else f_dialog_yesno "$msg_delete_primary_group" fi - retval=$? + local __retval=$? - if [ $retval -eq $DIALOG_OK ]; then - pw_group_delete="$msg_yes" + if [ $__retval -eq $DIALOG_OK ]; then + setvar "$__var_to_set" "$msg_yes" else - pw_group_delete="$msg_no" + setvar "$__var_to_set" "$msg_no" fi - save_flag=1 - - f_dprintf "pw_group_delete: [%s]->[%s]" \ - "$cur_pw_group_delete" "$pw_group_delete" - [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC + [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC } -# f_dialog_input_home_delete +# f_dialog_input_home_delete $var_to_set # -# Prompt the user to confirm deletion of a given user's home directory. If the -# user does not cancel (by choosing "No") or press ESC, the $pw_home_delete +# Prompt the user to confirm deletion of a given login's home directory. If the +# user does not cancel (by choosing "No") or press ESC, the $var_to_set # variable will hold $msg_yes upon return, otherwise $msg_no. Use these return # variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible. # f_dialog_input_home_delete() { - local retval + local __var_to_set="$1" f_dialog_yesno "$msg_delete_home_directory" - retval=$? + local __retval=$? - if [ $retval -eq $DIALOG_OK ]; then - pw_home_delete="$msg_yes" + if [ $__retval -eq $DIALOG_OK ]; then + setvar "$__var_to_set" "$msg_yes" else - pw_home_delete="$msg_no" + setvar "$__var_to_set" "$msg_no" fi - save_flag=1 - f_dprintf "pw_home_delete: [%s]->[%s]" \ - "$cur_pw_home_delete" "$pw_home_delete" - - [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC + [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC } -# f_dialog_input_dotfiles_create +# f_dialog_input_dotfiles_create $var_to_set # -# Prompt the user to confirm population of a given user's home directory with +# Prompt the user to confirm population of a given login's home directory with # sample dotfiles. If the user does not cancel (by choosing "No") or press ESC, -# the $pw_dotfiles_create variable will hold $msg_yes upon return, otherwise -# $msg_no. Use these return variables ($msg_yes and $msg_no) for comparison to -# be i18n-compatible. +# the $var_to_set variable will hold $msg_yes upon return, otherwise $msg_no. +# Use these return variables ($msg_yes and $msg_no) for comparison to be i18n- +# compatible. # f_dialog_input_dotfiles_create() { - local retval + local __var_to_set="$1" f_dialog_yesno "$msg_create_dotfiles" - retval=$? + local __retval=$? - if [ $retval -eq $DIALOG_OK ]; then - pw_dotfiles_create="$msg_yes" + if [ $__retval -eq $DIALOG_OK ]; then + setvar "$__var_to_set" "$msg_yes" else - pw_dotfiles_create="$msg_no" + setvar "$__var_to_set" "$msg_no" fi - save_flag=1 - - f_dprintf "pw_dotfiles_create: [%s]->[%s]" \ - "$cur_pw_dotfiles_create" "$pw_dotfiles_create" - [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC + [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC } -# f_dialog_input_shell [$shell] -# -# Allow the user to select a new login shell for a given user. If the user does -# not cancel or press ESC, the $pw_home_dir variable will hold the newly- -# configured value upon return. +# f_dialog_input_shell $var_to_set [$shell] # +# Allow the user to select a new shell for a given login. If the user does not +# cancel or press ESC, the $var_to_set variable will hold the newly-configured +# value upon return. # f_dialog_input_shell() { - local _input="$1" - local prompt="$msg_select_login_shell" - local radio_list= # Calculated below - local hline="$hline_arrows_space_tab_enter" + local __funcname=f_dialog_input_shell + local __var_to_set="$1" __input="$2" + local __prompt="$msg_select_login_shell" + local __radio_list= # Calculated below + local __defaultitem="$2" + local __hline="$hline_arrows_space_tab_enter" # # Generate the radiolist of shells # - local shell - for shell in $( awk '!/^[[:space:]]*(#|$)/{print}' "$ETC_SHELLS" ); do - # Format of a radiolist menu entry is "tag item status" - if [ "$shell" = "$_input" ]; then - radio_list="$radio_list '$shell' '' 'on'" + local __shell_list __s __shell __length=0 + f_eval_catch -k __shell_list $__funcname awk "awk '%s' \"%s\"" \ + '!/^[[:space:]]*(#|$)/{print}' "$ETC_SHELLS" || return $FAILURE + while [ $__length -ne ${#__shell_list} ]; do + __s="${__shell_list%%$NL*}" # First line + f_shell_escape "$__s" __shell + + # Format of a radiolist entry: tag item status + if [ "$__s" = "$__input" ]; then + __radio_list="$__radio_list '$__shell' '' 'on'" else - radio_list="$radio_list '$shell' '' 'off'" + __radio_list="$__radio_list '$__shell' '' 'off'" fi + + __length=${#__shell_list} + __shell_list="${__shell_list#*$NL}" # Kill line done - local height width rows - eval f_dialog_radiolist_size height width rows \ + local __height __width __rows + eval f_dialog_radiolist_size __height __width __rows \ \"\$DIALOG_TITLE\" \ \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $radio_list + \"\$__prompt\" \ + \"\$__hline\" \ + $__radio_list - _input=$( eval $DIALOG \ + __input=$( eval $DIALOG \ --title \"\$DIALOG_TITLE\" \ --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ + --hline \"\$__hline\" \ --ok-label \"\$msg_ok\" \ --cancel-label \"\$msg_cancel\" \ - --radiolist \"\$prompt\" \ - $height $width $rows \ - $radio_list \ + --default-item \"\$__defaultitem\" \ + --radiolist \"\$__prompt\" \ + $__height $__width $__rows \ + $__radio_list \ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || return $? # Return if user either pressed ESC or chose Cancel/No - f_dialog_data_sanitize _input + f_dialog_data_sanitize __input - pw_shell="$_input" - save_flag=1 + setvar "$__var_to_set" "$__input" + return $DIALOG_OK +} - f_dprintf "pw_shell: [%s]->[%s]" "$cur_pw_shell" "$pw_shell" +# f_dialog_menu_user_add [$defaultitem] +# +# Present a menu detailing the properties of a login that is about to be added. +# The user's menu choice is available using f_dialog_menutag_fetch(). Returns +# success unless the user chose Cancel or pressed ESC. Data to display is taken +# from environment variables user_account_expire, user_class, +# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir, +# user_member_groups, user_name, user_password_expire, user_shell, and +# user_uid. If $defaultitem is present and non-NULL, initially highlight the +# item in the menu. +# +f_dialog_menu_user_add() +{ + local funcname=f_dialog_menu_user_add + local prompt="$msg_save_exit_or_cancel" + local menu_list # Calculated below + local defaultitem="$1" + local hline="$hline_arrows_tab_enter" - return $DIALOG_OK + # Attempt to convert numeric UNIX time to calendar date/time + local user_account_expires_on= + if f_isinteger "$user_account_expire"; then + [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$( + date -r "$user_account_expire" "+%F %T %Z" + ) + else + user_account_expires_on="$user_account_expire" + fi + local user_password_expires_on= + if f_isinteger "$user_password_expire"; then + [ $user_password_expire -ne 0 ] && user_password_expires_on=$( + date -r "$user_password_expire" "+%F %T %Z" + ) + else + user_password_expires_on="$user_password_expire" + fi + + # Attempt to translate a numeric GID into `number (name)' + if f_isinteger "$user_gid"; then + local user_group + user_group=$( pw groupshow -g "$user_gid" 2> /dev/null ) && + user_gid="$user_gid (${user_group%%:*})" + fi + + # Localize potentially hostile variables and escape their values + # to the local variable (see f_shell_escape() of `strings.subr') + local var + for var in account_expires_on class dotfiles_create gecos gid \ + home_create home_dir member_groups name password_expires_on \ + shell uid \ + ; do + local _user_$var + eval f_shell_escape \"\$user_$var\" _user_$var + done + + menu_list=" + 'X' '$msg_add/$msg_exit' + '1' '$msg_login: $_user_name' + '2' '$msg_full_name: $_user_gecos' + '3' '$msg_password: -----' + '4' '$msg_user_id: $_user_uid' + '5' '$msg_group_id: $_user_gid' + '6' '$msg_member_of_groups: $_user_member_groups' + '7' '$msg_login_class: $_user_class' + '8' '$msg_password_expires_on: $_user_password_expires_on' + '9' '$msg_account_expires_on: $_user_account_expires_on' + 'A' '$msg_home_directory: $_user_home_dir' + 'B' '$msg_shell: $_user_shell' + " # END-QUOTE + case "$user_home_dir" in + /|/nonexistent|/var/empty) menu_list="$menu_list + '-' '$msg_create_home_directory: $msg_n_a' + '-' '$msg_create_dotfiles: $msg_n_a' + " # END-QUOTE + ;; + *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list + '-' '$msg_create_home_directory: $msg_n_a' + 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' + " # END-QUOTE + else menu_list="$menu_list + 'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}' + 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' + " # END-QUOTE + fi + esac + + local height width rows + eval f_dialog_menu_size height width rows \ + \"\$DIALOG_TITLE\" \ + \"\$DIALOG_BACKTITLE\" \ + \"\$prompt\" \ + \"\$hline\" \ + $menu_list + + local menu_choice + menu_choice=$( eval $DIALOG \ + --title \"\$DIALOG_TITLE\" \ + --backtitle \"\$DIALOG_BACKTITLE\" \ + --hline \"\$hline\" \ + --ok-label \"\$msg_ok\" \ + --cancel-label \"\$msg_cancel\" \ + --default-item \"\$defaultitem\" \ + --keep-tite \ + --menu \"\$prompt\" \ + $height $width $rows \ + $menu_list \ + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD + ) + local retval=$? + f_dialog_data_sanitize menu_choice + f_dialog_menutag_store "$menu_choice" + return $retval +} + +# f_dialog_menu_user_delete $user [$defaultitem] +# +# Present a menu detailing the properties of a login that is about to be +# deleted. The user's menu choice is available using f_dialog_menutag_fetch(). +# Returns success unless the user chose Cancel or pressed ESC. Data to display +# is populated automatically from the system accounting database for the given +# $user argument with the exception of two environment variables: +# user_group_delete and user_home_delete. If $defaultitem is present and non- +# NULL, initially highlight the item in the menu. +# +f_dialog_menu_user_delete() +{ + local prompt="$msg_delete_exit_or_cancel" + local menu_list # Calculated below + local defaultitem="$2" + local hline="$hline_arrows_tab_enter" + + local user_name user_password user_uid user_gid user_class + local user_password_expire user_account_expire user_gecos + local user_home_dir user_shell user_member_groups + f_input_user "$1" + + # Attempt to convert numeric UNIX time to calendar date/time + local user_account_expires_on= + if f_isinteger "$user_account_expire"; then + [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$( + date -r "$user_account_expire" "+%F %T %Z" + ) + else + user_account_expires_on="$user_account_expire" + fi + local user_password_expires_on= + if f_isinteger "$user_password_expire"; then + [ $user_password_expire -ne 0 ] && user_password_expires_on=$( + date -r "$user_password_expire" "+%F %T %Z" + ) + else + user_password_expires_on="$user_password_expire" + fi + + # Attempt to translate a numeric GID into `number (name)' + if f_isinteger "$user_gid"; then + local user_group + user_group=$( pw groupshow -g "$user_gid" 2> /dev/null ) && + user_gid="$user_gid (${user_group%%:*})" + fi + + # Localize potentially hostile variables and escape their values + # to the local variable (see f_shell_escape() of `strings.subr') + local var + for var in account_expires_on class gecos gid group_delete \ + home_delete home_dir member_groups name password_expires_on \ + shell uid \ + ; do + local _user_$var + eval f_shell_escape \"\$user_$var\" _user_$var + done + + menu_list=" + 'X' '$msg_delete/$msg_exit' + '1' '$msg_login: $_user_name' + '-' '$msg_full_name: $_user_gecos' + '-' '$msg_password: -----' + '-' '$msg_user_id: $_user_uid' + '-' '$msg_group_id: $_user_gid' + '-' '$msg_group_members: $_user_member_groups' + '-' '$msg_login_class: $_user_class' + '-' '$msg_password_expires_on: $_user_password_expires_on' + '-' '$msg_account_expires_on: $_user_account_expires_on' + '-' '$msg_home_directory: $_user_home_dir' + '-' '$msg_shell: $_user_shell' + " # END-QUOTE + if f_quietly pw groupshow -g "$user_gid"; then menu_list="$menu_list + 'C' '$msg_delete_primary_group: ${_user_group_delete:-$msg_no}' + " # END-QUOTE + else menu_list="$menu_list + '-' '$msg_delete_primary_group: $msg_n_a' + " # END-QUOTE + fi + case "$user_home_dir" in + /|/nonexistent|/var/empty) menu_list="$menu_list + '-' '$msg_delete_home_directory: $msg_n_a' + " # END-QUOTE + ;; + *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list + 'D' '$msg_delete_home_directory: ${_user_home_delete:-$msg_no}' + " # END-QUOTE + else menu_list="$menu_list + '-' '$msg_delete_home_directory: $msg_n_a' + " # END-QUOTE + fi + esac + + local height width rows + eval f_dialog_menu_size height width rows \ + \"\$DIALOG_TITLE\" \ + \"\$DIALOG_BACKTITLE\" \ + \"\$prompt\" \ + \"\$hline\" \ + $menu_list + + local menu_choice + menu_choice=$( eval $DIALOG \ + --title \"\$DIALOG_TITLE\" \ + --backtitle \"\$DIALOG_BACKTITLE\" \ + --hline \"\$hline\" \ + --ok-label \"\$msg_ok\" \ + --cancel-label \"\$msg_cancel\" \ + --default-item \"\$defaultitem\" \ + --keep-tite \ + --menu \"\$prompt\" \ + $height $width $rows \ + $menu_list \ + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD + ) + local retval=$? + f_dialog_data_sanitize menu_choice + f_dialog_menutag_store "$menu_choice" + return $retval +} + +# f_dialog_menu_user_edit [$defaultitem] +# +# Present a menu detailing the properties of a login that is about to be +# modified. The user's menu choice is available using f_dialog_menutag_fetch(). +# Returns success unless the user chose Cancel or pressed ESC. Data to display +# is taken from environment variables user_account_expire, user_class, +# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir, +# user_member_groups, user_name, user_password_expire, user_shell, and +# user_uid. If $defaultitem is present and non-NULL, initially highlight the +# item in the menu. +# +f_dialog_menu_user_edit() +{ + local prompt="$msg_save_exit_or_cancel" + local menu_list # Calculated below + local defaultitem="$1" + local hline="$hline_arrows_tab_enter" + + # Attempt to convert numeric UNIX time to calendar date/time + local user_account_expires_on= + if f_isinteger "$user_account_expire"; then + [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$( + date -r "$user_account_expire" "+%F %T %Z" + ) + else + user_account_expires_on="$user_account_expire" + fi + local user_password_expires_on= + if f_isinteger "$user_password_expire"; then + [ $user_password_expire -ne 0 ] && user_password_expires_on=$( + date -r "$user_password_expire" "+%F %T %Z" + ) + else + user_password_expires_on="$user_password_expire" + fi + + # Attempt to translate a numeric GID into `number (name)' + if f_isinteger "$user_gid"; then + local user_group + user_group=$( pw groupshow -g "$user_gid" 2> /dev/null ) && + user_gid="$user_gid (${user_group%%:*})" + fi + + # Localize potentially hostile variables and escape their values + # to the local variable (see f_shell_escape() of `strings.subr') + local var + for var in account_expires_on class dotfiles_create gecos gid \ + home_create home_dir member_groups name password_expires_on \ + shell uid \ + ; do + local _user_$var + eval f_shell_escape \"\$user_$var\" _user_$var + done + + menu_list=" + 'X' '$msg_save/$msg_exit' + '1' '$msg_login: $_user_name' + '2' '$msg_full_name: $_user_gecos' + '3' '$msg_password: -----' + '4' '$msg_user_id: $_user_uid' + '5' '$msg_group_id: $_user_gid' + '6' '$msg_member_of_groups: $_user_member_groups' + '7' '$msg_login_class: $_user_class' + '8' '$msg_password_expires_on: $_user_password_expires_on' + '9' '$msg_account_expires_on: $_user_account_expires_on' + 'A' '$msg_home_directory: $_user_home_dir' + 'B' '$msg_shell: $_user_shell' + " # END-QUOTE + case "$user_home_dir" in + /|/nonexistent|/var/empty) menu_list="$menu_list + '-' '$msg_create_home_directory: $msg_n_a' + '-' '$msg_create_dotfiles: $msg_n_a' + " # END-QUOTE + ;; + *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list + '-' '$msg_create_home_directory: $msg_n_a' + 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' + " # END-QUOTE + else menu_list="$menu_list + 'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}' + 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' + " # END-QUOTE + fi + esac + + local height width rows + eval f_dialog_menu_size height width rows \ + \"\$DIALOG_TITLE\" \ + \"\$DIALOG_BACKTITLE\" \ + \"\$prompt\" \ + \"\$hline\" \ + $menu_list + + local menu_choice + menu_choice=$( eval $DIALOG \ + --title \"\$DIALOG_TITLE\" \ + --backtitle \"\$DIALOG_BACKTITLE\" \ + --hline \"\$hline\" \ + --ok-label \"\$msg_ok\" \ + --cancel-label \"\$msg_cancel\" \ + --default-item \"\$defaultitem\" \ + --keep-tite \ + --menu \"\$prompt\" \ + $height $width $rows \ + $menu_list \ + 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD + ) + local retval=$? + f_dialog_data_sanitize menu_choice + f_dialog_menutag_store "$menu_choice" + return $retval } ############################################################ MAIN |