1ab2043b8SDevin Teskeif [ ! "$_USERMGMT_USER_INPUT_SUBR" ]; then _USERMGMT_USER_INPUT_SUBR=1 2ab2043b8SDevin Teske# 3ab2043b8SDevin Teske# Copyright (c) 2012 Ron McDowell 4f589320aSDevin Teske# Copyright (c) 2012-2014 Devin Teske 5ab2043b8SDevin Teske# All rights reserved. 6ab2043b8SDevin Teske# 7ab2043b8SDevin Teske# Redistribution and use in source and binary forms, with or without 8ab2043b8SDevin Teske# modification, are permitted provided that the following conditions 9ab2043b8SDevin Teske# are met: 10ab2043b8SDevin Teske# 1. Redistributions of source code must retain the above copyright 11ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer. 12ab2043b8SDevin Teske# 2. Redistributions in binary form must reproduce the above copyright 13ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer in the 14ab2043b8SDevin Teske# documentation and/or other materials provided with the distribution. 15ab2043b8SDevin Teske# 16ab2043b8SDevin Teske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17ab2043b8SDevin Teske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18ab2043b8SDevin Teske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19ab2043b8SDevin Teske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20ab2043b8SDevin Teske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21ab2043b8SDevin Teske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22ab2043b8SDevin Teske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23ab2043b8SDevin Teske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24ab2043b8SDevin Teske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25ab2043b8SDevin Teske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ab2043b8SDevin Teske# SUCH DAMAGE. 27ab2043b8SDevin Teske# 28ab2043b8SDevin Teske# 29ab2043b8SDevin Teske############################################################ INCLUDES 30ab2043b8SDevin Teske 31ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig" 32ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1 3356961fd7SDevin Teskef_dprintf "%s: loading includes..." usermgmt/user_input.subr 34ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr 35ab2043b8SDevin Teskef_include $BSDCFG_SHARE/strings.subr 36ab2043b8SDevin Teske 37ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="070.usermgmt" 38ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/include/messages.subr 39ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 40ab2043b8SDevin Teske 41ab2043b8SDevin Teske############################################################ CONFIGURATION 42ab2043b8SDevin Teske 43ab2043b8SDevin Teske# 44ab2043b8SDevin Teske# Default location of shells(5) 45ab2043b8SDevin Teske# 46ab2043b8SDevin Teske: ${ETC_SHELLS:=/etc/shells} 47ab2043b8SDevin Teske 48ab2043b8SDevin Teske############################################################ FUNCTIONS 49ab2043b8SDevin Teske 50f589320aSDevin Teske# f_get_member_groups $var_to_set $user 51ab2043b8SDevin Teske# 52ab2043b8SDevin Teske# Get a list of additional groups $user is a member of in group(5). 53ab2043b8SDevin Teske# 54ab2043b8SDevin Teskef_get_member_groups() 55ab2043b8SDevin Teske{ 56f589320aSDevin Teske f_replaceall "$( pw groupshow -a | awk -F: -v user="$2" '{ 57f589320aSDevin Teske if (!split($4, users, /,/)) next 58f589320aSDevin Teske for (u in users) if (users[u] == user) { print $1; next } 59f589320aSDevin Teske }' )" "[$NL]" "," "$1" 60ab2043b8SDevin Teske} 61ab2043b8SDevin Teske 62ab2043b8SDevin Teske# f_input_user $user 63ab2043b8SDevin Teske# 64f589320aSDevin Teske# Given $user name or id, create the environment variables user_name, user_uid, 65f589320aSDevin Teske# user_gid, user_class, user_password_expire, user_account_expire, user_gecos, 66f589320aSDevin Teske# user_home_dir, user_shell, and user_member_groups (and user_password is reset 67f589320aSDevin Teske# to NULL). 68ab2043b8SDevin Teske# 69ab2043b8SDevin Teskef_input_user() 70ab2043b8SDevin Teske{ 71f589320aSDevin Teske local funcname=f_input_user 72ab2043b8SDevin Teske local user="$1" 73f589320aSDevin Teske 74f589320aSDevin Teske f_dprintf "$funcname: Getting info for user \`%s'" "$user" 75f589320aSDevin Teske eval "$( pw usershow "$user" 2> /dev/null | awk -F: ' 76f589320aSDevin Teske function set_value(var, value) { 77f589320aSDevin Teske gsub(/'\''/, "'\''\\'\'\''", value) 78f589320aSDevin Teske printf "user_%s='\'%s\''\n", var, value 79f589320aSDevin Teske } 80ab2043b8SDevin Teske { 81f589320aSDevin Teske found = $1 != "" 82f589320aSDevin Teske set_value("name", $1 ) 83f589320aSDevin Teske set_value("password", "" ) 84f589320aSDevin Teske set_value("uid", $3 ) 85f589320aSDevin Teske set_value("gid", $4 ) 86f589320aSDevin Teske set_value("class", $5 ) 87f589320aSDevin Teske set_value("password_expire", $6 ) 88f589320aSDevin Teske set_value("account_expire", $7 ) 89f589320aSDevin Teske set_value("gecos", $8 ) 90f589320aSDevin Teske set_value("home_dir", $9 ) 91f589320aSDevin Teske set_value("shell", $10) 92f589320aSDevin Teske exit 93f589320aSDevin Teske } 94f589320aSDevin Teske END { if (!found) print "false" }' )" 95f589320aSDevin Teske local retval=$? 96f589320aSDevin Teske 97f589320aSDevin Teske f_dprintf "$funcname: Getting group memberships for user \`%s'" "$user" 98f589320aSDevin Teske f_get_member_groups user_member_groups "$user" 99f589320aSDevin Teske 100f589320aSDevin Teske return $retval 101ab2043b8SDevin Teske} 102ab2043b8SDevin Teske 103d3a0f918SDevin Teske# f_dialog_menu_user_list [$default] 104ab2043b8SDevin Teske# 105d3a0f918SDevin Teske# Allows the user to select a login from a list. Optionally, if present and 106d3a0f918SDevin Teske# non-NULL, initially highlight $default user. 107ab2043b8SDevin Teske# 108ab2043b8SDevin Teskef_dialog_menu_user_list() 109ab2043b8SDevin Teske{ 110052f8969SDevin Teske local prompt= 111052f8969SDevin Teske local menu_list=" 112ab2043b8SDevin Teske 'X $msg_exit' '' 113ab2043b8SDevin Teske " # END-QUOTE 114052f8969SDevin Teske local defaultitem="$1" 115052f8969SDevin Teske local hline="$hline_alnum_punc_tab_enter" 116ab2043b8SDevin Teske 117ab2043b8SDevin Teske # Add users from passwd(5) 118ab2043b8SDevin Teske menu_list="$menu_list $( pw usershow -a | awk -F: ' 119f589320aSDevin Teske function mprint(tag, item) { 120f589320aSDevin Teske gsub(/'\''/, "'\''\\'\'\''", tag) 121f589320aSDevin Teske gsub(/'\''/, "'\''\\'\'\''", item) 122f589320aSDevin Teske printf "'\'%s\'\ \'%s\''\n", tag, item 123f589320aSDevin Teske } 124f589320aSDevin Teske !/^[[:space:]]*(#|$)/ { mprint($1, $8) } 125f589320aSDevin Teske ' )" 126ab2043b8SDevin Teske 12774036c4dSDevin Teske local height width rows 12874036c4dSDevin Teske eval f_dialog_menu_size height width rows \ 129ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 130ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 131052f8969SDevin Teske \"\$prompt\" \ 132ab2043b8SDevin Teske \"\$hline\" \ 13374036c4dSDevin Teske $menu_list 134ab2043b8SDevin Teske 135fd962ac6SDevin Teske local menu_choice 136fd962ac6SDevin Teske menu_choice=$( eval $DIALOG \ 137d3a0f918SDevin Teske --title \"\$DIALOG_TITLE\" \ 138ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 139ab2043b8SDevin Teske --hline \"\$hline\" \ 140ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 141ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 142d3a0f918SDevin Teske --default-item \"\$defaultitem\" \ 143052f8969SDevin Teske --menu \"\$prompt\" \ 14474036c4dSDevin Teske $height $width $rows \ 14574036c4dSDevin Teske $menu_list \ 14689498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 14789498fdfSDevin Teske ) 14889498fdfSDevin Teske local retval=$? 149fd962ac6SDevin Teske f_dialog_menutag_store -s "$menu_choice" 15089498fdfSDevin Teske return $retval 151ab2043b8SDevin Teske} 152ab2043b8SDevin Teske 153f589320aSDevin Teske# f_dialog_input_member_groups $var_to_set [$member_groups] 154ab2043b8SDevin Teske# 155ab2043b8SDevin Teske# Allows the user to edit group memberships for a given user. If the user does 156f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly- 157ab2043b8SDevin Teske# configured value upon return. 158ab2043b8SDevin Teske# 159ab2043b8SDevin Teskef_dialog_input_member_groups() 160ab2043b8SDevin Teske{ 161f589320aSDevin Teske local __var_to_set="$1" __input="$2" 162f589320aSDevin Teske local __prompt="$msg_member_of_groups" 163f589320aSDevin Teske local __menu_list=" 164f589320aSDevin Teske 'X' '$msg_continue' 165f589320aSDevin Teske '1' '$msg_select_groups_from_list' 166f589320aSDevin Teske '2' '$msg_enter_groups_manually' 167f589320aSDevin Teske " # END-QUOTE 168f589320aSDevin Teske local __defaultitem= 169f589320aSDevin Teske local __hline="$hline_alnum_space_tab_enter" 170052f8969SDevin Teske 171f589320aSDevin Teske local __mheight __mwidth __mrows 172f589320aSDevin Teske eval f_dialog_menu_size __mheight __mwidth __mrows \ 173ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 174ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 175f589320aSDevin Teske \"\$__prompt\" \ 176f589320aSDevin Teske \"\$__hline\" \ 177f589320aSDevin Teske $__menu_list 178f589320aSDevin Teske 179f589320aSDevin Teske local __menu_choice __retval 180f589320aSDevin Teske while :; do 181f589320aSDevin Teske __menu_choice=$( eval $DIALOG \ 182f589320aSDevin Teske --title \"\$DIALOG_TITLE\" \ 183f589320aSDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 184f589320aSDevin Teske --hline \"\$__hline\" \ 185f589320aSDevin Teske --ok-label \"\$msg_ok\" \ 186f589320aSDevin Teske --cancel-label \"\$msg_cancel\" \ 187f589320aSDevin Teske --default-item \"\$__defaultitem\" \ 188f589320aSDevin Teske --menu \"\$__prompt\" \ 189f589320aSDevin Teske $__mheight $__mwidth $__mrows \ 190f589320aSDevin Teske $__menu_list \ 191f589320aSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 192f589320aSDevin Teske ) 193f589320aSDevin Teske __retval=$? 194f589320aSDevin Teske f_dialog_data_sanitize __menu_choice 195f589320aSDevin Teske __defaultitem="$__menu_choice" 196f589320aSDevin Teske f_dprintf "retval=%u menu_choice=[%s]" \ 197f589320aSDevin Teske $__retval "$__menu_choice" 198f589320aSDevin Teske 199f589320aSDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 200f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || return $__retval 201f589320aSDevin Teske 202f589320aSDevin Teske local __member_groups 203f589320aSDevin Teske case "$__menu_choice" in 204f589320aSDevin Teske X) # Exit 205f589320aSDevin Teske break ;; 206f589320aSDevin Teske 1) # Select Groups from a list 207f589320aSDevin Teske local __check_list= # Calculated below 208f589320aSDevin Teske local __group_list __g __grp __length=0 209f589320aSDevin Teske __group_list=$( pw groupshow -a | 210f589320aSDevin Teske awk -F: '!/^[[:space:]]*(#|$)/{print $1}' ) 211f589320aSDevin Teske while [ $__length -ne ${#__group_list} ]; do 212f589320aSDevin Teske __g="${__group_list%%$NL*}" # First line 213f589320aSDevin Teske f_shell_escape "$__g" __grp 214f589320aSDevin Teske 215f589320aSDevin Teske # Format of a checklist entry: tag item status 216f589320aSDevin Teske # NB: Setting both tag/item to group name below 217f589320aSDevin Teske __check_list="$__check_list '$__grp' '$__grp'" 218f589320aSDevin Teske case "$__input" in 219f589320aSDevin Teske "$__g"|"$__g",*|*,"$__g",*|*,"$__g") 220f589320aSDevin Teske __check_list="$__check_list on" ;; 221f589320aSDevin Teske *) 222f589320aSDevin Teske __check_list="$__check_list off" 223f589320aSDevin Teske esac 224f589320aSDevin Teske 225f589320aSDevin Teske __length=${#__group_list} 226f589320aSDevin Teske __group_list="${__group_list#*$NL}" # Kill line 227f589320aSDevin Teske done 228f589320aSDevin Teske 229f589320aSDevin Teske local __cheight __cwidth __crows 230f589320aSDevin Teske 231f589320aSDevin Teske eval f_dialog_checklist_size \ 232f589320aSDevin Teske __cheight __cwidth __crows \ 233f589320aSDevin Teske \"\$DIALOG_TITLE\" \ 234f589320aSDevin Teske \"\$DIALOG_BACKTITLE\" \ 235f589320aSDevin Teske \"\$__prompt\" \ 236f589320aSDevin Teske \"\$__hline\" \ 237f589320aSDevin Teske $__check_list 238f589320aSDevin Teske __member_groups=$( eval $DIALOG \ 239ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 240ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 241ab2043b8SDevin Teske --separate-output \ 242f589320aSDevin Teske --hline \"\$__hline\" \ 243ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 244ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 245f589320aSDevin Teske --checklist \"\$__prompt\" \ 246f589320aSDevin Teske $__cheight $__cwidth $__crows \ 247f589320aSDevin Teske $__check_list \ 24889498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 249f589320aSDevin Teske ) || continue 250f589320aSDevin Teske # Return to previous menu if user either 251f589320aSDevin Teske # pressed ESC or chose Cancel/No 252f589320aSDevin Teske f_dialog_data_sanitize __member_groups 253f589320aSDevin Teske 254f589320aSDevin Teske # 255f589320aSDevin Teske # Convert the newline separated list into a comma- 256f589320aSDevin Teske # separated one so that if the user switches over to 257f589320aSDevin Teske # manual editing, list reflects checklist selections 258f589320aSDevin Teske # 259f589320aSDevin Teske f_replaceall "$__member_groups" "[$NL]" "," __input 260f589320aSDevin Teske ;; 261f589320aSDevin Teske 2) # Enter Groups manually 262f589320aSDevin Teske local __prompt2="$msg_groups" 263f589320aSDevin Teske __prompt2="$__prompt2 ($msg_separated_by_commas)" 264f589320aSDevin Teske 265f589320aSDevin Teske f_dialog_input __member_groups \ 266f589320aSDevin Teske "$__prompt2" "$__input" \ 267f589320aSDevin Teske "$hline_num_tab_enter" || continue 268f589320aSDevin Teske # Return to previous menu if user either 269f589320aSDevin Teske # pressed ESC or chose Cancel/No 270ab2043b8SDevin Teske 271ab2043b8SDevin Teske # 272ab2043b8SDevin Teske # Validate each of the groups the user has entered 273ab2043b8SDevin Teske # 274f589320aSDevin Teske local __all_groups_valid=1 __grp __grp_list 275f589320aSDevin Teske f_replaceall "$__member_groups" "," " " __grp_list 276f589320aSDevin Teske for __grp in $__grp_list; do 277f589320aSDevin Teske if ! f_quietly pw groupshow -n "$__grp"; then 278f589320aSDevin Teske f_show_msg "$msg_group_not_found" \ 279f589320aSDevin Teske "$__grp" 280f589320aSDevin Teske __all_groups_valid= 281ab2043b8SDevin Teske break 282ab2043b8SDevin Teske fi 283ab2043b8SDevin Teske done 284f589320aSDevin Teske [ "$__all_groups_valid" ] || continue 285ab2043b8SDevin Teske 286f589320aSDevin Teske __input="$__member_groups" 287f589320aSDevin Teske ;; 288f589320aSDevin Teske esac 289ab2043b8SDevin Teske done 290ab2043b8SDevin Teske 291f589320aSDevin Teske setvar "$__var_to_set" "$__input" 292f677a9e2SDevin Teske return $DIALOG_OK 293ab2043b8SDevin Teske} 294ab2043b8SDevin Teske 295f589320aSDevin Teske# f_dialog_input_name $var_to_set [$name] 296ab2043b8SDevin Teske# 297ab2043b8SDevin Teske# Allows the user to enter a new username for a given user. If the user does 298f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly- 299f589320aSDevin Teske# configured value upon return. 300ab2043b8SDevin Teske# 301ab2043b8SDevin Teskef_dialog_input_name() 302ab2043b8SDevin Teske{ 303f589320aSDevin Teske local __var_to_set="$1" __name="$2" 304f589320aSDevin Teske 305ab2043b8SDevin Teske # 306ab2043b8SDevin Teske # Loop until the user provides taint-free/valid input 307ab2043b8SDevin Teske # 308f589320aSDevin Teske local __input="$__name" 309ab2043b8SDevin Teske while :; do 310ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 311f589320aSDevin Teske f_dialog_input __input "$msg_login" "$__input" \ 312f677a9e2SDevin Teske "$hline_alnum_tab_enter" || return $? 313ab2043b8SDevin Teske 314ab2043b8SDevin Teske # Check for no-change 315f589320aSDevin Teske if [ "$__input" = "$__name" ]; then 316f589320aSDevin Teske setvar "$__var_to_set" "$__input" 317f677a9e2SDevin Teske return $DIALOG_OK 318ab2043b8SDevin Teske fi 319ab2043b8SDevin Teske 320ab2043b8SDevin Teske # Check for NULL entry 321f589320aSDevin Teske if [ ! "$__input" ]; then 3227079fc4eSDevin Teske f_show_msg "$msg_login_is_empty" 323ab2043b8SDevin Teske continue 324ab2043b8SDevin Teske fi 325ab2043b8SDevin Teske 326ab2043b8SDevin Teske # Check for invalid entry 327f589320aSDevin Teske case "$__input" in [!a-zA-Z]*) 3287079fc4eSDevin Teske f_show_msg "$msg_login_must_start_with_letter" 329ab2043b8SDevin Teske continue 330f589320aSDevin Teske esac 331ab2043b8SDevin Teske 332ab2043b8SDevin Teske # Check for duplicate entry 333f589320aSDevin Teske if f_quietly pw usershow -n "$__input"; then 334f589320aSDevin Teske f_show_msg "$msg_login_already_used" "$__input" 335ab2043b8SDevin Teske continue 336ab2043b8SDevin Teske fi 337ab2043b8SDevin Teske 338f589320aSDevin Teske setvar "$__var_to_set" "$__input" 339ab2043b8SDevin Teske break 340ab2043b8SDevin Teske done 341ab2043b8SDevin Teske 342f677a9e2SDevin Teske return $DIALOG_OK 343ab2043b8SDevin Teske} 344ab2043b8SDevin Teske 345f589320aSDevin Teske# f_dialog_input_password $var_to_set $dvar_to_set 346ab2043b8SDevin Teske# 347f589320aSDevin Teske# Prompt the user to enter a password (twice). If the user does not cancel or 348f589320aSDevin Teske# press ESC, $var_to_set will hold the confirmed user entry. Otherwise, if the 349f589320aSDevin Teske# user cancels or enters a NULL password (twice), they are given the choice to 350f589320aSDevin Teske# disable password authentication for the given login, wherein $dvar_to_set has 351f589320aSDevin Teske# a value of 1 to indicate password authentication should be disabled. 352ab2043b8SDevin Teske# 353ab2043b8SDevin Teskef_dialog_input_password() 354ab2043b8SDevin Teske{ 355f589320aSDevin Teske local __var_to_set="$1" __dvar_to_set="$2" 356f589320aSDevin Teske local __prompt1="$msg_password" 357f589320aSDevin Teske local __prompt2="$msg_reenter_password" 358f589320aSDevin Teske local __hline="$hline_alnum_punc_tab_enter" 359ab2043b8SDevin Teske 360f589320aSDevin Teske local __height1 __width1 361f589320aSDevin Teske f_dialog_inputbox_size __height1 __width1 \ 362ab2043b8SDevin Teske "$DIALOG_TITLE" \ 363ab2043b8SDevin Teske "$DIALOG_BACKTITLE" \ 364f589320aSDevin Teske "$__prompt1" \ 365ab2043b8SDevin Teske "" \ 366f589320aSDevin Teske "$__hline" 367f589320aSDevin Teske local __height2 __width2 368f589320aSDevin Teske f_dialog_inputbox_size __height2 __width2 \ 369ab2043b8SDevin Teske "$DIALOG_TITLE" \ 370ab2043b8SDevin Teske "$DIALOG_BACKTITLE" \ 371f589320aSDevin Teske "$__prompt2" \ 372ab2043b8SDevin Teske "" \ 373f589320aSDevin Teske "$__hline" 374ab2043b8SDevin Teske 375ab2043b8SDevin Teske # 376ab2043b8SDevin Teske # Loop until the user provides taint-free/valid input 377ab2043b8SDevin Teske # 378f589320aSDevin Teske local __retval __password1 __password2 379ab2043b8SDevin Teske while :; do 380f589320aSDevin Teske __password1=$( $DIALOG \ 38174036c4dSDevin Teske --title "$DIALOG_TITLE" \ 38274036c4dSDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 383f589320aSDevin Teske --hline "$__hline" \ 38474036c4dSDevin Teske --ok-label "$msg_ok" \ 38574036c4dSDevin Teske --cancel-label "$msg_cancel" \ 386ab2043b8SDevin Teske --insecure \ 387f589320aSDevin Teske --passwordbox "$__prompt1" \ 388f589320aSDevin Teske $__height1 $__width1 \ 38989498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 390ec7120b5SDevin Teske ) || return $? 391ec7120b5SDevin Teske # Return if user either pressed ESC or chose Cancel/No 392f589320aSDevin Teske debug= f_dialog_line_sanitize __password1 393ab2043b8SDevin Teske 394f589320aSDevin Teske __password2=$( $DIALOG \ 39574036c4dSDevin Teske --title "$DIALOG_TITLE" \ 39674036c4dSDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 397f589320aSDevin Teske --hline "$__hline" \ 39874036c4dSDevin Teske --ok-label "$msg_ok" \ 39974036c4dSDevin Teske --cancel-label "$msg_cancel" \ 400ab2043b8SDevin Teske --insecure \ 401f589320aSDevin Teske --passwordbox "$__prompt2" \ 402f589320aSDevin Teske $__height2 $__width2 \ 40389498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 404ec7120b5SDevin Teske ) || return $? 405ec7120b5SDevin Teske # Return if user either pressed ESC or chose Cancel/No 406f589320aSDevin Teske debug= f_dialog_line_sanitize __password2 407ab2043b8SDevin Teske 408ab2043b8SDevin Teske # Check for password mismatch 409f589320aSDevin Teske if [ "$__password1" != "$__password2" ]; then 4107079fc4eSDevin Teske f_show_msg "$msg_passwords_do_not_match" 411ab2043b8SDevin Teske continue 412ab2043b8SDevin Teske fi 413ab2043b8SDevin Teske 414ab2043b8SDevin Teske # Check for NULL entry 415f589320aSDevin Teske if [ ! "$__password1" ]; then 4167ca5c4cbSDevin Teske f_dialog_yesno "$msg_disable_password_auth_for_account" 417f589320aSDevin Teske __retval=$? 418f589320aSDevin Teske if [ $__retval -eq $DIALOG_ESC ]; then 419f589320aSDevin Teske return $__retval 420f589320aSDevin Teske elif [ $__retval -eq $DIALOG_OK ]; then 421f589320aSDevin Teske setvar "$__dvar_to_set" 1 422528318aeSDevin Teske else 423350db065SDevin Teske continue # back to password prompt 424528318aeSDevin Teske fi 425ab2043b8SDevin Teske else 426f589320aSDevin Teske setvar "$__dvar_to_set" "" 427ab2043b8SDevin Teske fi 428ab2043b8SDevin Teske 429f589320aSDevin Teske setvar "$__var_to_set" "$__password1" 430ab2043b8SDevin Teske break 431ab2043b8SDevin Teske done 432ab2043b8SDevin Teske 433f677a9e2SDevin Teske return $DIALOG_OK 434ab2043b8SDevin Teske} 435ab2043b8SDevin Teske 436f589320aSDevin Teske# f_dialog_input_gecos $var_to_set [$gecos] 437ab2043b8SDevin Teske# 438ab2043b8SDevin Teske# Allow the user to enter new GECOS information for a given user. This 439ab2043b8SDevin Teske# information is commonly used to store the ``Full Name'' of the user. If the 440f589320aSDevin Teske# user does not cancel or press ESC, the $var_to_set variable will hold the 441ab2043b8SDevin Teske# newly-configured value upon return. 442ab2043b8SDevin Teske# 443ab2043b8SDevin Teskef_dialog_input_gecos() 444ab2043b8SDevin Teske{ 445f589320aSDevin Teske local __var_to_set="$1" __input="$2" 446ab2043b8SDevin Teske 447ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 448f589320aSDevin Teske f_dialog_input __input "$msg_full_name" "$__input" \ 449f677a9e2SDevin Teske "$hline_alnum_punc_tab_enter" || return $? 450ab2043b8SDevin Teske 451f589320aSDevin Teske setvar "$__var_to_set" "$__input" 452f677a9e2SDevin Teske return $DIALOG_OK 453ab2043b8SDevin Teske} 454ab2043b8SDevin Teske 455f589320aSDevin Teske# f_dialog_input_uid $var_to_set [$uid] 456ab2043b8SDevin Teske# 457ab2043b8SDevin Teske# Allow the user to enter a new UID for a given user. If the user does not 458f589320aSDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured 459ab2043b8SDevin Teske# value upon return. 460ab2043b8SDevin Teske# 461ab2043b8SDevin Teskef_dialog_input_uid() 462ab2043b8SDevin Teske{ 463f589320aSDevin Teske local __var_to_set="$1" __input="$2" 464ab2043b8SDevin Teske 465ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 466f589320aSDevin Teske f_dialog_input __input "$msg_user_id_leave_empty_for_default" \ 467f589320aSDevin Teske "$__input" "$hline_num_tab_enter" || return $? 468ab2043b8SDevin Teske 469f589320aSDevin Teske setvar "$__var_to_set" "$__input" 470f677a9e2SDevin Teske return $DIALOG_OK 471ab2043b8SDevin Teske} 472ab2043b8SDevin Teske 473f589320aSDevin Teske# f_dialog_input_gid $var_to_set [$gid] 474ab2043b8SDevin Teske# 475ab2043b8SDevin Teske# Allow the user to enter a new primary GID for a given user. If the user does 476f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly- 477f589320aSDevin Teske# configured value upon return. 478ab2043b8SDevin Teske# 479ab2043b8SDevin Teskef_dialog_input_gid() 480ab2043b8SDevin Teske{ 481f589320aSDevin Teske local __var_to_set="$1" __input="$2" 482ab2043b8SDevin Teske 483ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 484f589320aSDevin Teske f_dialog_input __input "$msg_group_id_leave_empty_for_default" \ 485f589320aSDevin Teske "$__input" "$hline_num_tab_enter" || return $? 486ab2043b8SDevin Teske 487f589320aSDevin Teske setvar "$__var_to_set" "$__input" 488f677a9e2SDevin Teske return $DIALOG_OK 489ab2043b8SDevin Teske} 490ab2043b8SDevin Teske 491f589320aSDevin Teske# f_dialog_input_class $var_to_set [$class] 492ab2043b8SDevin Teske# 493ab2043b8SDevin Teske# Allow the user to enter a new login class for a given user. If the user does 494f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly- 495ab2043b8SDevin Teske# configured value upon return. 496ab2043b8SDevin Teske# 497ab2043b8SDevin Teskef_dialog_input_class() 498ab2043b8SDevin Teske{ 499f589320aSDevin Teske local __var_to_set="$1" __input="$2" 500ab2043b8SDevin Teske 501ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 502f589320aSDevin Teske f_dialog_input __input "$msg_login_class" "$__input" \ 503f677a9e2SDevin Teske "$hline_alnum_tab_enter" || return $? 504ab2043b8SDevin Teske 505f589320aSDevin Teske setvar "$__var_to_set" "$__input" 506f677a9e2SDevin Teske return $DIALOG_OK 507ab2043b8SDevin Teske} 508ab2043b8SDevin Teske 509f589320aSDevin Teske# f_dialog_input_expire_password $var_to_set [$seconds] 510ab2043b8SDevin Teske# 511ab2043b8SDevin Teske# Allow the user to enter a date/time (in number-of-seconds since the `epoch') 512ab2043b8SDevin Teske# for when a given user's password must be changed. If the user does not cancel 513f589320aSDevin Teske# or press ESC, the $var_to_set variable will hold the newly-configured value 514f589320aSDevin Teske# upon return. 515ab2043b8SDevin Teske# 5163b4e3098SDevin Teskef_dialog_input_expire_password() 517ab2043b8SDevin Teske{ 518f589320aSDevin Teske local __var_to_set="$1" __input="$2" 519f589320aSDevin Teske local __prompt="$msg_password_expires_on" 520f589320aSDevin Teske local __menu_list=" 521ab2043b8SDevin Teske '1' '$msg_password_does_not_expire' 522ab2043b8SDevin Teske '2' '$msg_edit_date_time_with_a_calendar' 523f589320aSDevin Teske '3' '$msg_enter_value_manually' 524ab2043b8SDevin Teske " # END-QUOTE 525f589320aSDevin Teske local __defaultitem= # Calculated below 526f589320aSDevin Teske local __hline="$hline_num_arrows_tab_enter" 527ab2043b8SDevin Teske 528f589320aSDevin Teske local __mheight __mwidth __mrows 529f589320aSDevin Teske eval f_dialog_menu_size __mheight __mwidth __mrows \ 530ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 531ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 532f589320aSDevin Teske \"\$__prompt\" \ 533f589320aSDevin Teske \"\$__hline\" \ 534f589320aSDevin Teske $__menu_list 535f589320aSDevin Teske local __cheight __cwidth 536f589320aSDevin Teske f_dialog_calendar_size __cheight __cwidth \ 53774036c4dSDevin Teske "$DIALOG_TITLE" \ 53874036c4dSDevin Teske "$DIALOG_BACKTITLE" \ 539f589320aSDevin Teske "$__prompt" \ 540f589320aSDevin Teske "$__hline" 541f589320aSDevin Teske local __theight __twidth 542f589320aSDevin Teske f_dialog_timebox_size __theight __twidth \ 54374036c4dSDevin Teske "$DIALOG_TITLE" \ 54474036c4dSDevin Teske "$DIALOG_BACKTITLE" \ 545f589320aSDevin Teske "$__prompt" \ 546f589320aSDevin Teske "$__hline" 547ab2043b8SDevin Teske 54874036c4dSDevin Teske # 54974036c4dSDevin Teske # Loop until the user provides taint-free/cancellation-free input 55074036c4dSDevin Teske # 551f589320aSDevin Teske local __retval __date_type 55274036c4dSDevin Teske while :; do 553f589320aSDevin Teske __date_type=$( eval $DIALOG \ 554ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 555ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 556f589320aSDevin Teske --hline \"\$__hline\" \ 557f589320aSDevin Teske --default-item \"\$__defaultitem\" \ 558ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 559ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 560f589320aSDevin Teske --menu \"\$__prompt\" \ 561f589320aSDevin Teske $__mheight $__mwidth $__mrows \ 562f589320aSDevin Teske $__menu_list \ 56389498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 56489498fdfSDevin Teske ) 565f589320aSDevin Teske __retval=$? 566f589320aSDevin Teske f_dialog_data_sanitize __date_type 567f589320aSDevin Teske __defaultitem="$__date_type" 568f589320aSDevin Teske f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type" 569ab2043b8SDevin Teske 570ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 571f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || return $__retval 572ab2043b8SDevin Teske 573f589320aSDevin Teske case "$__date_type" in 574ab2043b8SDevin Teske 1) # Password does not expire 575f589320aSDevin Teske __input= break ;; 576ab2043b8SDevin Teske 577ab2043b8SDevin Teske 2) # Edit date/time with a calendar 578f589320aSDevin Teske local __input_date __input_time __ret_date __ret_time 579ab2043b8SDevin Teske 580f589320aSDevin Teske local __seconds="$__input" 581f589320aSDevin Teske { f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } || 582f589320aSDevin Teske __seconds= 583f589320aSDevin Teske __input_date=$( date -j -f "%s" -- "$__seconds" \ 584fb7d723eSDevin Teske "+%d %m %Y" 2> /dev/null ) 585f589320aSDevin Teske __ret_date=$( eval $DIALOG \ 586ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 587ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 588f589320aSDevin Teske --hline \"\$__hline\" \ 589ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 590ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 591f589320aSDevin Teske --calendar \"\$__prompt\" \ 592f589320aSDevin Teske $__cheight $__cwidth \ 593f589320aSDevin Teske $__input_date \ 59489498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 59589498fdfSDevin Teske ) 596f589320aSDevin Teske __retval=$? 597f589320aSDevin Teske f_dialog_data_sanitize __ret_date 598f589320aSDevin Teske f_dprintf "retval=%u ret_date=[%s]" \ 599f589320aSDevin Teske $__retval "$__ret_date" 600ab2043b8SDevin Teske 601ab2043b8SDevin Teske # Return to menu if either ESC or Cancel/No 602f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || continue 603ab2043b8SDevin Teske 604f589320aSDevin Teske __input_time= 605f589320aSDevin Teske [ "$__seconds" ] && __input_time=$( date -j \ 606f589320aSDevin Teske -f %s -- "$__input" "+%H %M %S" 2> /dev/null ) 607f589320aSDevin Teske __ret_time=$( eval $DIALOG \ 608ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 609ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 610f589320aSDevin Teske --hline \"\$__hline\" \ 611ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 612ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 613f589320aSDevin Teske --timebox \"\$__prompt\" \ 614f589320aSDevin Teske $__theight $__twidth \ 615f589320aSDevin Teske $__input_time \ 61689498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 61789498fdfSDevin Teske ) 618f589320aSDevin Teske __retval=$? 619f589320aSDevin Teske f_dialog_data_sanitize __ret_time 620f589320aSDevin Teske f_dprintf "retval=%u ret_time=[%s]" \ 621f589320aSDevin Teske $__retval "$__ret_time" 622ab2043b8SDevin Teske 623ab2043b8SDevin Teske # Return to menu if either ESC or Cancel/No 624f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || continue 625ab2043b8SDevin Teske 626f589320aSDevin Teske __input=$( date -j -f "%d/%m/%Y %T" -- \ 627f589320aSDevin Teske "$__ret_date $__ret_time" +%s 2> /dev/null ) 628f589320aSDevin Teske f_dprintf "input=[%s]" "$__input" 629ab2043b8SDevin Teske break ;; 630ab2043b8SDevin Teske 631f589320aSDevin Teske 3) # Enter value manually 632f589320aSDevin Teske local __msg __new_input 633f589320aSDevin Teske f_sprintf __msg "$msg_password_expire_manual_edit" \ 634f589320aSDevin Teske "$( date -r 0 "+%c %Z" )" 635ab2043b8SDevin Teske 636ab2043b8SDevin Teske # Return to menu if either ESC or Cancel/No 637f589320aSDevin Teske f_dialog_input __new_input \ 638f589320aSDevin Teske "$__msg" "$__input" "$__hline" || continue 639ab2043b8SDevin Teske 640f589320aSDevin Teske __input="$__new_input" 641f589320aSDevin Teske f_dprintf "input=[%s]" "$__input" 642ab2043b8SDevin Teske break ;; 643ab2043b8SDevin Teske 644ab2043b8SDevin Teske esac 645ab2043b8SDevin Teske 646ab2043b8SDevin Teske done # Loop forever 647ab2043b8SDevin Teske 648f589320aSDevin Teske setvar "$__var_to_set" "$__input" 649f677a9e2SDevin Teske return $DIALOG_OK 650ab2043b8SDevin Teske} 651ab2043b8SDevin Teske 652f589320aSDevin Teske# f_dialog_input_expire_account $var_to_set [$seconds] 653ab2043b8SDevin Teske# 654ab2043b8SDevin Teske# Allow the user to enter a date/time (in number-of-seconds since the `epoch') 655ab2043b8SDevin Teske# for when a given user's account should become expired. If the user does not 656f589320aSDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured 657f589320aSDevin Teske# value upon return. 658ab2043b8SDevin Teske# 6593b4e3098SDevin Teskef_dialog_input_expire_account() 660ab2043b8SDevin Teske{ 661f589320aSDevin Teske local __var_to_set="$1" __input="$2" 662f589320aSDevin Teske local __prompt="$msg_account_expires_on" 663f589320aSDevin Teske local __menu_list=" 664ab2043b8SDevin Teske '1' '$msg_account_does_not_expire' 665ab2043b8SDevin Teske '2' '$msg_edit_date_time_with_a_calendar' 666f589320aSDevin Teske '3' '$msg_enter_value_manually' 667ab2043b8SDevin Teske " # END-QUOTE 668f589320aSDevin Teske local __defaultitem= # Calculated below 669f589320aSDevin Teske local __hline="$hline_num_arrows_tab_enter" 670ab2043b8SDevin Teske 671f589320aSDevin Teske local __mheight __mwidth __mrows 672f589320aSDevin Teske eval f_dialog_menu_size __mheight __mwidth __mrows \ 673ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 674ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 675f589320aSDevin Teske \"\$__prompt\" \ 676f589320aSDevin Teske \"\$__hline\" \ 677f589320aSDevin Teske $__menu_list 678f589320aSDevin Teske local __cheight __cwidth 679f589320aSDevin Teske f_dialog_calendar_size __cheight __cwidth \ 68074036c4dSDevin Teske "$DIALOG_TITLE" \ 68174036c4dSDevin Teske "$DIALOG_BACKTITLE" \ 682f589320aSDevin Teske "$__prompt" \ 683f589320aSDevin Teske "$__hline" 684f589320aSDevin Teske local __theight __twidth 685f589320aSDevin Teske f_dialog_timebox_size __theight __twidth \ 68674036c4dSDevin Teske "$DIALOG_TITLE" \ 68774036c4dSDevin Teske "$DIALOG_BACKTITLE" \ 688f589320aSDevin Teske "$__prompt" \ 689f589320aSDevin Teske "$__hline" 690ab2043b8SDevin Teske 69174036c4dSDevin Teske # 69274036c4dSDevin Teske # Loop until the user provides taint-free/cancellation-free input 69374036c4dSDevin Teske # 694f589320aSDevin Teske local __retval __date_type 69574036c4dSDevin Teske while :; do 696f589320aSDevin Teske __date_type=$( eval $DIALOG \ 697ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 698ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 699f589320aSDevin Teske --hline \"\$__hline\" \ 700f589320aSDevin Teske --default-item \"\$__defaultitem\" \ 701ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 702ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 703f589320aSDevin Teske --menu \"\$__prompt\" \ 704f589320aSDevin Teske $__mheight $__mwidth $__mrows \ 705f589320aSDevin Teske $__menu_list \ 70689498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 70789498fdfSDevin Teske ) 708f589320aSDevin Teske __retval=$? 709f589320aSDevin Teske f_dialog_data_sanitize __date_type 710f589320aSDevin Teske __defaultitem="$__date_type" 711f589320aSDevin Teske f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type" 712ab2043b8SDevin Teske 713ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 714f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || return $__retval 715ab2043b8SDevin Teske 716f589320aSDevin Teske case "$__date_type" in 717ab2043b8SDevin Teske 1) # Account does not expire 718f589320aSDevin Teske __input= break ;; 719ab2043b8SDevin Teske 720ab2043b8SDevin Teske 2) # Edit date/time with a calendar 721f589320aSDevin Teske local __input_date __input_time __ret_date __ret_time 722ab2043b8SDevin Teske 723f589320aSDevin Teske local __seconds="$__input" 724f589320aSDevin Teske { f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } || 725f589320aSDevin Teske __seconds= 726f589320aSDevin Teske __input_date=$( date -j -f "%s" -- "$__seconds" \ 727fb7d723eSDevin Teske "+%d %m %Y" 2> /dev/null ) 728f589320aSDevin Teske __ret_date=$( eval $DIALOG \ 729ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 730ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 731f589320aSDevin Teske --hline \"\$__hline\" \ 732ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 733ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 734f589320aSDevin Teske --calendar \"\$__prompt\" \ 735f589320aSDevin Teske $__cheight $__cwidth \ 736f589320aSDevin Teske $__input_date \ 73789498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 73889498fdfSDevin Teske ) 739f589320aSDevin Teske __retval=$? 740f589320aSDevin Teske f_dialog_data_sanitize __ret_date 741f589320aSDevin Teske f_dprintf "retval=%u ret_date=[%s]" \ 742f589320aSDevin Teske $__retval "$__ret_date" 743ab2043b8SDevin Teske 744ab2043b8SDevin Teske # Return to menu if either ESC or Cancel/No 745f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || continue 746ab2043b8SDevin Teske 747f589320aSDevin Teske __input_time= 748f589320aSDevin Teske [ "$__seconds" ] && __input_time=$( date -j \ 749f589320aSDevin Teske -f %s -- "$__input" "+%H %M %S" 2> /dev/null ) 750f589320aSDevin Teske __ret_time=$( eval $DIALOG \ 751ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 752ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 753f589320aSDevin Teske --hline \"\$__hline\" \ 754ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 755ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 756f589320aSDevin Teske --timebox \"\$__prompt\" \ 757f589320aSDevin Teske $__theight $__twidth \ 758f589320aSDevin Teske $__input_time \ 75989498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 76089498fdfSDevin Teske ) 761f589320aSDevin Teske __retval=$? 762f589320aSDevin Teske f_dialog_data_sanitize __ret_time 763f589320aSDevin Teske f_dprintf "retval=%u ret_time=[%s]" \ 764f589320aSDevin Teske $__retval "$__ret_time" 765ab2043b8SDevin Teske 766ab2043b8SDevin Teske # Return to menu if either ESC or Cancel/No 767f589320aSDevin Teske [ $__retval -eq $DIALOG_OK ] || continue 768ab2043b8SDevin Teske 769f589320aSDevin Teske __input=$( date -j -f "%d/%m/%Y %T" -- \ 770f589320aSDevin Teske "$ret_date $ret_time" +%s 2> /dev/null ) 771f589320aSDevin Teske f_dprintf "input=[%s]" "$__input" 772ab2043b8SDevin Teske break ;; 773ab2043b8SDevin Teske 774f589320aSDevin Teske 3) # Enter value manually 775f589320aSDevin Teske local __msg __new_input 776f589320aSDevin Teske f_sprintf __msg "$msg_account_expire_manual_edit" \ 777f589320aSDevin Teske "$( date -r 0 "+%c %Z" )" 778ab2043b8SDevin Teske 779ab2043b8SDevin Teske # Return to menu if either ESC or Cancel/No 780f589320aSDevin Teske f_dialog_input __new_input \ 781f589320aSDevin Teske "$__msg" "$__input" "$__hline" || continue 782ab2043b8SDevin Teske 783f589320aSDevin Teske __input="$__new_input" 784f589320aSDevin Teske f_dprintf "input=[%s]" "$__input" 785ab2043b8SDevin Teske break ;; 786ab2043b8SDevin Teske 787ab2043b8SDevin Teske esac 788ab2043b8SDevin Teske 789ab2043b8SDevin Teske done # Loop forever 790ab2043b8SDevin Teske 791f589320aSDevin Teske setvar "$__var_to_set" "$__input" 792f677a9e2SDevin Teske return $DIALOG_OK 793ab2043b8SDevin Teske} 794ab2043b8SDevin Teske 795f589320aSDevin Teske# f_dialog_input_home_dir $var_to_set [$home_dir] 796ab2043b8SDevin Teske# 797f589320aSDevin Teske# Allow the user to enter a new home directory for a given login. If the user 798f589320aSDevin Teske# does not cancel or press ESC, the $var_to_set variable will hold the newly- 799ab2043b8SDevin Teske# configured value upon return. 800ab2043b8SDevin Teske# 801ab2043b8SDevin Teskef_dialog_input_home_dir() 802ab2043b8SDevin Teske{ 803f589320aSDevin Teske local __var_to_set="$1" __input="$2" 804ab2043b8SDevin Teske 805ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 806f589320aSDevin Teske f_dialog_input __input "$msg_home_directory" "$__input" \ 807f677a9e2SDevin Teske "$hline_alnum_punc_tab_enter" || return $? 808ab2043b8SDevin Teske 809f589320aSDevin Teske setvar "$__var_to_set" "$__input" 810f677a9e2SDevin Teske return $DIALOG_OK 811ab2043b8SDevin Teske} 812ab2043b8SDevin Teske 813f589320aSDevin Teske# f_dialog_input_home_create $var_to_set 814ab2043b8SDevin Teske# 815f589320aSDevin Teske# Prompt the user to confirm creation of a given login's home directory. If the 816f589320aSDevin Teske# user does not cancel (by choosing "No") or press ESC, the $var_to_set 817ab2043b8SDevin Teske# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return 818ab2043b8SDevin Teske# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible. 819ab2043b8SDevin Teske# 820ab2043b8SDevin Teskef_dialog_input_home_create() 821ab2043b8SDevin Teske{ 822f589320aSDevin Teske local __var_to_set="$1" 823ab2043b8SDevin Teske 824ab2043b8SDevin Teske f_dialog_yesno "$msg_create_home_directory" 825f589320aSDevin Teske local __retval=$? 826ab2043b8SDevin Teske 827f589320aSDevin Teske if [ $__retval -eq $DIALOG_OK ]; then 828f589320aSDevin Teske setvar "$__var_to_set" "$msg_yes" 829ab2043b8SDevin Teske else 830f589320aSDevin Teske setvar "$__var_to_set" "$msg_no" 831ab2043b8SDevin Teske fi 832ab2043b8SDevin Teske 833f589320aSDevin Teske [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC 834ab2043b8SDevin Teske} 835ab2043b8SDevin Teske 836f589320aSDevin Teske# f_dialog_input_group_delete $var_to_set [$group] 837ab2043b8SDevin Teske# 838f589320aSDevin Teske# Prompt the user to confirm deletion of a given login's primary group. If the 839f589320aSDevin Teske# user does not cancel (by choosing "No") or press ESC, the $var_to_set 840ab2043b8SDevin Teske# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return 841ab2043b8SDevin Teske# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible. 842ab2043b8SDevin Teske# 843ab2043b8SDevin Teskef_dialog_input_group_delete() 844ab2043b8SDevin Teske{ 845f589320aSDevin Teske local __var_to_set="$1" __group="$2" 846ab2043b8SDevin Teske 847f589320aSDevin Teske if f_isinteger "$__group"; then 848f589320aSDevin Teske if [ $__group -lt 1000 ]; then 849ab2043b8SDevin Teske f_dialog_noyes "$msg_delete_primary_group" 850ab2043b8SDevin Teske else 851ab2043b8SDevin Teske f_dialog_yesno "$msg_delete_primary_group" 852ab2043b8SDevin Teske fi 853f589320aSDevin Teske elif [ "$__group" ]; then 854f589320aSDevin Teske local __gid=0 855f589320aSDevin Teske __gid=$( pw groupshow "$__group" | awk -F: '{print $3}' ) 856f589320aSDevin Teske if f_isinteger "$__gid" && [ $__gid -lt 1000 ]; then 857ab2043b8SDevin Teske f_dialog_noyes "$msg_delete_primary_group" 858ab2043b8SDevin Teske else 859ab2043b8SDevin Teske f_dialog_yesno "$msg_delete_primary_group" 860ab2043b8SDevin Teske fi 861ab2043b8SDevin Teske else 862ab2043b8SDevin Teske f_dialog_yesno "$msg_delete_primary_group" 863ab2043b8SDevin Teske fi 864f589320aSDevin Teske local __retval=$? 865ab2043b8SDevin Teske 866f589320aSDevin Teske if [ $__retval -eq $DIALOG_OK ]; then 867f589320aSDevin Teske setvar "$__var_to_set" "$msg_yes" 868ab2043b8SDevin Teske else 869f589320aSDevin Teske setvar "$__var_to_set" "$msg_no" 870ab2043b8SDevin Teske fi 871ab2043b8SDevin Teske 872f589320aSDevin Teske [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC 873ab2043b8SDevin Teske} 874ab2043b8SDevin Teske 875f589320aSDevin Teske# f_dialog_input_home_delete $var_to_set 876ab2043b8SDevin Teske# 877f589320aSDevin Teske# Prompt the user to confirm deletion of a given login's home directory. If the 878f589320aSDevin Teske# user does not cancel (by choosing "No") or press ESC, the $var_to_set 879ab2043b8SDevin Teske# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return 880ab2043b8SDevin Teske# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible. 881ab2043b8SDevin Teske# 882ab2043b8SDevin Teskef_dialog_input_home_delete() 883ab2043b8SDevin Teske{ 884f589320aSDevin Teske local __var_to_set="$1" 885ab2043b8SDevin Teske 886ab2043b8SDevin Teske f_dialog_yesno "$msg_delete_home_directory" 887f589320aSDevin Teske local __retval=$? 888ab2043b8SDevin Teske 889f589320aSDevin Teske if [ $__retval -eq $DIALOG_OK ]; then 890f589320aSDevin Teske setvar "$__var_to_set" "$msg_yes" 891ab2043b8SDevin Teske else 892f589320aSDevin Teske setvar "$__var_to_set" "$msg_no" 893ab2043b8SDevin Teske fi 894ab2043b8SDevin Teske 895f589320aSDevin Teske [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC 896ab2043b8SDevin Teske} 897ab2043b8SDevin Teske 898f589320aSDevin Teske# f_dialog_input_dotfiles_create $var_to_set 899ab2043b8SDevin Teske# 900f589320aSDevin Teske# Prompt the user to confirm population of a given login's home directory with 901ab2043b8SDevin Teske# sample dotfiles. If the user does not cancel (by choosing "No") or press ESC, 902f589320aSDevin Teske# the $var_to_set variable will hold $msg_yes upon return, otherwise $msg_no. 903f589320aSDevin Teske# Use these return variables ($msg_yes and $msg_no) for comparison to be i18n- 904f589320aSDevin Teske# compatible. 905ab2043b8SDevin Teske# 906ab2043b8SDevin Teskef_dialog_input_dotfiles_create() 907ab2043b8SDevin Teske{ 908f589320aSDevin Teske local __var_to_set="$1" 909ab2043b8SDevin Teske 910ab2043b8SDevin Teske f_dialog_yesno "$msg_create_dotfiles" 911f589320aSDevin Teske local __retval=$? 912ab2043b8SDevin Teske 913f589320aSDevin Teske if [ $__retval -eq $DIALOG_OK ]; then 914f589320aSDevin Teske setvar "$__var_to_set" "$msg_yes" 915ab2043b8SDevin Teske else 916f589320aSDevin Teske setvar "$__var_to_set" "$msg_no" 917ab2043b8SDevin Teske fi 918ab2043b8SDevin Teske 919f589320aSDevin Teske [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC 920ab2043b8SDevin Teske} 921ab2043b8SDevin Teske 922f589320aSDevin Teske# f_dialog_input_shell $var_to_set [$shell] 923ab2043b8SDevin Teske# 924f589320aSDevin Teske# Allow the user to select a new shell for a given login. If the user does not 925f589320aSDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured 926f589320aSDevin Teske# value upon return. 927ab2043b8SDevin Teske# 928ab2043b8SDevin Teskef_dialog_input_shell() 929ab2043b8SDevin Teske{ 930f589320aSDevin Teske local __funcname=f_dialog_input_shell 931f589320aSDevin Teske local __var_to_set="$1" __input="$2" 932f589320aSDevin Teske local __prompt="$msg_select_login_shell" 933f589320aSDevin Teske local __radio_list= # Calculated below 934f589320aSDevin Teske local __defaultitem="$2" 935f589320aSDevin Teske local __hline="$hline_arrows_space_tab_enter" 936ab2043b8SDevin Teske 937052f8969SDevin Teske # 938052f8969SDevin Teske # Generate the radiolist of shells 939052f8969SDevin Teske # 940f589320aSDevin Teske local __shell_list __s __shell __length=0 941f589320aSDevin Teske f_eval_catch -k __shell_list $__funcname awk "awk '%s' \"%s\"" \ 942f589320aSDevin Teske '!/^[[:space:]]*(#|$)/{print}' "$ETC_SHELLS" || return $FAILURE 943f589320aSDevin Teske while [ $__length -ne ${#__shell_list} ]; do 944f589320aSDevin Teske __s="${__shell_list%%$NL*}" # First line 945f589320aSDevin Teske f_shell_escape "$__s" __shell 946f589320aSDevin Teske 947f589320aSDevin Teske # Format of a radiolist entry: tag item status 948f589320aSDevin Teske if [ "$__s" = "$__input" ]; then 949f589320aSDevin Teske __radio_list="$__radio_list '$__shell' '' 'on'" 950ab2043b8SDevin Teske else 951f589320aSDevin Teske __radio_list="$__radio_list '$__shell' '' 'off'" 952ab2043b8SDevin Teske fi 953f589320aSDevin Teske 954f589320aSDevin Teske __length=${#__shell_list} 955f589320aSDevin Teske __shell_list="${__shell_list#*$NL}" # Kill line 956ab2043b8SDevin Teske done 957ab2043b8SDevin Teske 958f589320aSDevin Teske local __height __width __rows 959f589320aSDevin Teske eval f_dialog_radiolist_size __height __width __rows \ 960f589320aSDevin Teske \"\$DIALOG_TITLE\" \ 961f589320aSDevin Teske \"\$DIALOG_BACKTITLE\" \ 962f589320aSDevin Teske \"\$__prompt\" \ 963f589320aSDevin Teske \"\$__hline\" \ 964f589320aSDevin Teske $__radio_list 965f589320aSDevin Teske 966f589320aSDevin Teske __input=$( eval $DIALOG \ 967f589320aSDevin Teske --title \"\$DIALOG_TITLE\" \ 968f589320aSDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 969f589320aSDevin Teske --hline \"\$__hline\" \ 970f589320aSDevin Teske --ok-label \"\$msg_ok\" \ 971f589320aSDevin Teske --cancel-label \"\$msg_cancel\" \ 972f589320aSDevin Teske --default-item \"\$__defaultitem\" \ 973f589320aSDevin Teske --radiolist \"\$__prompt\" \ 974f589320aSDevin Teske $__height $__width $__rows \ 975f589320aSDevin Teske $__radio_list \ 976f589320aSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 977f589320aSDevin Teske ) || return $? 978f589320aSDevin Teske # Return if user either pressed ESC or chose Cancel/No 979f589320aSDevin Teske f_dialog_data_sanitize __input 980f589320aSDevin Teske 981f589320aSDevin Teske setvar "$__var_to_set" "$__input" 982f589320aSDevin Teske return $DIALOG_OK 983f589320aSDevin Teske} 984f589320aSDevin Teske 985f589320aSDevin Teske# f_dialog_menu_user_add [$defaultitem] 986f589320aSDevin Teske# 987f589320aSDevin Teske# Present a menu detailing the properties of a login that is about to be added. 988f589320aSDevin Teske# The user's menu choice is available using f_dialog_menutag_fetch(). Returns 989f589320aSDevin Teske# success unless the user chose Cancel or pressed ESC. Data to display is taken 990f589320aSDevin Teske# from environment variables user_account_expire, user_class, 991f589320aSDevin Teske# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir, 992f589320aSDevin Teske# user_member_groups, user_name, user_password_expire, user_shell, and 993f589320aSDevin Teske# user_uid. If $defaultitem is present and non-NULL, initially highlight the 994f589320aSDevin Teske# item in the menu. 995f589320aSDevin Teske# 996f589320aSDevin Teskef_dialog_menu_user_add() 997f589320aSDevin Teske{ 998f589320aSDevin Teske local funcname=f_dialog_menu_user_add 999f589320aSDevin Teske local prompt="$msg_save_exit_or_cancel" 1000f589320aSDevin Teske local menu_list # Calculated below 1001f589320aSDevin Teske local defaultitem="$1" 1002f589320aSDevin Teske local hline="$hline_arrows_tab_enter" 1003f589320aSDevin Teske 1004f589320aSDevin Teske # Attempt to convert numeric UNIX time to calendar date/time 1005f589320aSDevin Teske local user_account_expires_on= 1006f589320aSDevin Teske if f_isinteger "$user_account_expire"; then 1007f589320aSDevin Teske [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$( 1008f589320aSDevin Teske date -r "$user_account_expire" "+%F %T %Z" 1009f589320aSDevin Teske ) 1010f589320aSDevin Teske else 1011f589320aSDevin Teske user_account_expires_on="$user_account_expire" 1012f589320aSDevin Teske fi 1013f589320aSDevin Teske local user_password_expires_on= 1014f589320aSDevin Teske if f_isinteger "$user_password_expire"; then 1015f589320aSDevin Teske [ $user_password_expire -ne 0 ] && user_password_expires_on=$( 1016f589320aSDevin Teske date -r "$user_password_expire" "+%F %T %Z" 1017f589320aSDevin Teske ) 1018f589320aSDevin Teske else 1019f589320aSDevin Teske user_password_expires_on="$user_password_expire" 1020f589320aSDevin Teske fi 1021f589320aSDevin Teske 1022f589320aSDevin Teske # Localize potentially hostile variables and escape their values 1023f589320aSDevin Teske # to the local variable (see f_shell_escape() of `strings.subr') 1024f589320aSDevin Teske local var 1025f589320aSDevin Teske for var in account_expires_on class dotfiles_create gecos gid \ 1026f589320aSDevin Teske home_create home_dir member_groups name password_expires_on \ 1027f589320aSDevin Teske shell uid \ 1028f589320aSDevin Teske ; do 1029f589320aSDevin Teske local _user_$var 1030f589320aSDevin Teske eval f_shell_escape \"\$user_$var\" _user_$var 1031f589320aSDevin Teske done 1032f589320aSDevin Teske 1033*389e4940SDevin Teske # Attempt to translate a numeric GID into `number (name)' 1034*389e4940SDevin Teske if f_isinteger "$_user_gid"; then 1035*389e4940SDevin Teske local _user_group 1036*389e4940SDevin Teske _user_group=$( pw groupshow -g "$_user_gid" 2> /dev/null ) && 1037*389e4940SDevin Teske _user_group="${_user_group%%:*}" && 1038*389e4940SDevin Teske f_shell_escape "$_user_gid ($_user_group)" _user_gid 1039*389e4940SDevin Teske fi 1040*389e4940SDevin Teske 1041f589320aSDevin Teske menu_list=" 1042f589320aSDevin Teske 'X' '$msg_add/$msg_exit' 1043f589320aSDevin Teske '1' '$msg_login: $_user_name' 1044f589320aSDevin Teske '2' '$msg_full_name: $_user_gecos' 1045f589320aSDevin Teske '3' '$msg_password: -----' 1046f589320aSDevin Teske '4' '$msg_user_id: $_user_uid' 1047f589320aSDevin Teske '5' '$msg_group_id: $_user_gid' 1048f589320aSDevin Teske '6' '$msg_member_of_groups: $_user_member_groups' 1049f589320aSDevin Teske '7' '$msg_login_class: $_user_class' 1050f589320aSDevin Teske '8' '$msg_password_expires_on: $_user_password_expires_on' 1051f589320aSDevin Teske '9' '$msg_account_expires_on: $_user_account_expires_on' 1052f589320aSDevin Teske 'A' '$msg_home_directory: $_user_home_dir' 1053f589320aSDevin Teske 'B' '$msg_shell: $_user_shell' 1054f589320aSDevin Teske " # END-QUOTE 1055f589320aSDevin Teske case "$user_home_dir" in 1056f589320aSDevin Teske /|/nonexistent|/var/empty) menu_list="$menu_list 1057f589320aSDevin Teske '-' '$msg_create_home_directory: $msg_n_a' 1058f589320aSDevin Teske '-' '$msg_create_dotfiles: $msg_n_a' 1059f589320aSDevin Teske " # END-QUOTE 1060f589320aSDevin Teske ;; 1061f589320aSDevin Teske *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list 1062f589320aSDevin Teske '-' '$msg_create_home_directory: $msg_n_a' 1063f589320aSDevin Teske 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' 1064f589320aSDevin Teske " # END-QUOTE 1065f589320aSDevin Teske else menu_list="$menu_list 1066f589320aSDevin Teske 'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}' 1067f589320aSDevin Teske 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' 1068f589320aSDevin Teske " # END-QUOTE 1069f589320aSDevin Teske fi 1070f589320aSDevin Teske esac 1071f589320aSDevin Teske 107274036c4dSDevin Teske local height width rows 1073f589320aSDevin Teske eval f_dialog_menu_size height width rows \ 1074ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 1075ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 1076ab2043b8SDevin Teske \"\$prompt\" \ 1077ab2043b8SDevin Teske \"\$hline\" \ 1078f589320aSDevin Teske $menu_list 1079ab2043b8SDevin Teske 1080f589320aSDevin Teske local menu_choice 1081f589320aSDevin Teske menu_choice=$( eval $DIALOG \ 1082ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 1083ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 1084ab2043b8SDevin Teske --hline \"\$hline\" \ 1085ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 1086ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 1087f589320aSDevin Teske --default-item \"\$defaultitem\" \ 1088f589320aSDevin Teske --keep-tite \ 1089f589320aSDevin Teske --menu \"\$prompt\" \ 109074036c4dSDevin Teske $height $width $rows \ 1091f589320aSDevin Teske $menu_list \ 109289498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 1093f589320aSDevin Teske ) 1094f589320aSDevin Teske local retval=$? 1095f589320aSDevin Teske f_dialog_data_sanitize menu_choice 1096f589320aSDevin Teske f_dialog_menutag_store "$menu_choice" 1097f589320aSDevin Teske return $retval 1098f589320aSDevin Teske} 1099ab2043b8SDevin Teske 1100f589320aSDevin Teske# f_dialog_menu_user_delete $user [$defaultitem] 1101f589320aSDevin Teske# 1102f589320aSDevin Teske# Present a menu detailing the properties of a login that is about to be 1103f589320aSDevin Teske# deleted. The user's menu choice is available using f_dialog_menutag_fetch(). 1104f589320aSDevin Teske# Returns success unless the user chose Cancel or pressed ESC. Data to display 1105f589320aSDevin Teske# is populated automatically from the system accounting database for the given 1106f589320aSDevin Teske# $user argument with the exception of two environment variables: 1107f589320aSDevin Teske# user_group_delete and user_home_delete. If $defaultitem is present and non- 1108f589320aSDevin Teske# NULL, initially highlight the item in the menu. 1109f589320aSDevin Teske# 1110f589320aSDevin Teskef_dialog_menu_user_delete() 1111f589320aSDevin Teske{ 1112f589320aSDevin Teske local prompt="$msg_delete_exit_or_cancel" 1113f589320aSDevin Teske local menu_list # Calculated below 1114f589320aSDevin Teske local defaultitem="$2" 1115f589320aSDevin Teske local hline="$hline_arrows_tab_enter" 1116ab2043b8SDevin Teske 1117f589320aSDevin Teske local user_name user_password user_uid user_gid user_class 1118f589320aSDevin Teske local user_password_expire user_account_expire user_gecos 1119f589320aSDevin Teske local user_home_dir user_shell user_member_groups 1120f589320aSDevin Teske f_input_user "$1" 1121ab2043b8SDevin Teske 1122f589320aSDevin Teske # Attempt to convert numeric UNIX time to calendar date/time 1123f589320aSDevin Teske local user_account_expires_on= 1124f589320aSDevin Teske if f_isinteger "$user_account_expire"; then 1125f589320aSDevin Teske [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$( 1126f589320aSDevin Teske date -r "$user_account_expire" "+%F %T %Z" 1127f589320aSDevin Teske ) 1128f589320aSDevin Teske else 1129f589320aSDevin Teske user_account_expires_on="$user_account_expire" 1130f589320aSDevin Teske fi 1131f589320aSDevin Teske local user_password_expires_on= 1132f589320aSDevin Teske if f_isinteger "$user_password_expire"; then 1133f589320aSDevin Teske [ $user_password_expire -ne 0 ] && user_password_expires_on=$( 1134f589320aSDevin Teske date -r "$user_password_expire" "+%F %T %Z" 1135f589320aSDevin Teske ) 1136f589320aSDevin Teske else 1137f589320aSDevin Teske user_password_expires_on="$user_password_expire" 1138f589320aSDevin Teske fi 1139f589320aSDevin Teske 1140f589320aSDevin Teske # Localize potentially hostile variables and escape their values 1141f589320aSDevin Teske # to the local variable (see f_shell_escape() of `strings.subr') 1142f589320aSDevin Teske local var 1143f589320aSDevin Teske for var in account_expires_on class gecos gid group_delete \ 1144f589320aSDevin Teske home_delete home_dir member_groups name password_expires_on \ 1145f589320aSDevin Teske shell uid \ 1146f589320aSDevin Teske ; do 1147f589320aSDevin Teske local _user_$var 1148f589320aSDevin Teske eval f_shell_escape \"\$user_$var\" _user_$var 1149f589320aSDevin Teske done 1150f589320aSDevin Teske 1151*389e4940SDevin Teske # Attempt to translate a numeric GID into `number (name)' 1152*389e4940SDevin Teske if f_isinteger "$_user_gid"; then 1153*389e4940SDevin Teske local _user_group 1154*389e4940SDevin Teske _user_group=$( pw groupshow -g "$_user_gid" 2> /dev/null ) && 1155*389e4940SDevin Teske _user_group="${_user_group%%:*}" && 1156*389e4940SDevin Teske f_shell_escape "$_user_gid ($_user_group)" _user_gid 1157*389e4940SDevin Teske fi 1158*389e4940SDevin Teske 1159f589320aSDevin Teske menu_list=" 1160f589320aSDevin Teske 'X' '$msg_delete/$msg_exit' 1161f589320aSDevin Teske '1' '$msg_login: $_user_name' 1162f589320aSDevin Teske '-' '$msg_full_name: $_user_gecos' 1163f589320aSDevin Teske '-' '$msg_password: -----' 1164f589320aSDevin Teske '-' '$msg_user_id: $_user_uid' 1165f589320aSDevin Teske '-' '$msg_group_id: $_user_gid' 1166f589320aSDevin Teske '-' '$msg_group_members: $_user_member_groups' 1167f589320aSDevin Teske '-' '$msg_login_class: $_user_class' 1168f589320aSDevin Teske '-' '$msg_password_expires_on: $_user_password_expires_on' 1169f589320aSDevin Teske '-' '$msg_account_expires_on: $_user_account_expires_on' 1170f589320aSDevin Teske '-' '$msg_home_directory: $_user_home_dir' 1171f589320aSDevin Teske '-' '$msg_shell: $_user_shell' 1172f589320aSDevin Teske " # END-QUOTE 1173f589320aSDevin Teske if f_quietly pw groupshow -g "$user_gid"; then menu_list="$menu_list 1174f589320aSDevin Teske 'C' '$msg_delete_primary_group: ${_user_group_delete:-$msg_no}' 1175f589320aSDevin Teske " # END-QUOTE 1176f589320aSDevin Teske else menu_list="$menu_list 1177f589320aSDevin Teske '-' '$msg_delete_primary_group: $msg_n_a' 1178f589320aSDevin Teske " # END-QUOTE 1179f589320aSDevin Teske fi 1180f589320aSDevin Teske case "$user_home_dir" in 1181f589320aSDevin Teske /|/nonexistent|/var/empty) menu_list="$menu_list 1182f589320aSDevin Teske '-' '$msg_delete_home_directory: $msg_n_a' 1183f589320aSDevin Teske " # END-QUOTE 1184f589320aSDevin Teske ;; 1185f589320aSDevin Teske *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list 1186f589320aSDevin Teske 'D' '$msg_delete_home_directory: ${_user_home_delete:-$msg_no}' 1187f589320aSDevin Teske " # END-QUOTE 1188f589320aSDevin Teske else menu_list="$menu_list 1189f589320aSDevin Teske '-' '$msg_delete_home_directory: $msg_n_a' 1190f589320aSDevin Teske " # END-QUOTE 1191f589320aSDevin Teske fi 1192f589320aSDevin Teske esac 1193f589320aSDevin Teske 1194f589320aSDevin Teske local height width rows 1195f589320aSDevin Teske eval f_dialog_menu_size height width rows \ 1196f589320aSDevin Teske \"\$DIALOG_TITLE\" \ 1197f589320aSDevin Teske \"\$DIALOG_BACKTITLE\" \ 1198f589320aSDevin Teske \"\$prompt\" \ 1199f589320aSDevin Teske \"\$hline\" \ 1200f589320aSDevin Teske $menu_list 1201f589320aSDevin Teske 1202f589320aSDevin Teske local menu_choice 1203f589320aSDevin Teske menu_choice=$( eval $DIALOG \ 1204f589320aSDevin Teske --title \"\$DIALOG_TITLE\" \ 1205f589320aSDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 1206f589320aSDevin Teske --hline \"\$hline\" \ 1207f589320aSDevin Teske --ok-label \"\$msg_ok\" \ 1208f589320aSDevin Teske --cancel-label \"\$msg_cancel\" \ 1209f589320aSDevin Teske --default-item \"\$defaultitem\" \ 1210f589320aSDevin Teske --keep-tite \ 1211f589320aSDevin Teske --menu \"\$prompt\" \ 1212f589320aSDevin Teske $height $width $rows \ 1213f589320aSDevin Teske $menu_list \ 1214f589320aSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 1215f589320aSDevin Teske ) 1216f589320aSDevin Teske local retval=$? 1217f589320aSDevin Teske f_dialog_data_sanitize menu_choice 1218f589320aSDevin Teske f_dialog_menutag_store "$menu_choice" 1219f589320aSDevin Teske return $retval 1220f589320aSDevin Teske} 1221f589320aSDevin Teske 1222f589320aSDevin Teske# f_dialog_menu_user_edit [$defaultitem] 1223f589320aSDevin Teske# 1224f589320aSDevin Teske# Present a menu detailing the properties of a login that is about to be 1225f589320aSDevin Teske# modified. The user's menu choice is available using f_dialog_menutag_fetch(). 1226f589320aSDevin Teske# Returns success unless the user chose Cancel or pressed ESC. Data to display 1227f589320aSDevin Teske# is taken from environment variables user_account_expire, user_class, 1228f589320aSDevin Teske# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir, 1229f589320aSDevin Teske# user_member_groups, user_name, user_password_expire, user_shell, and 1230f589320aSDevin Teske# user_uid. If $defaultitem is present and non-NULL, initially highlight the 1231f589320aSDevin Teske# item in the menu. 1232f589320aSDevin Teske# 1233f589320aSDevin Teskef_dialog_menu_user_edit() 1234f589320aSDevin Teske{ 1235f589320aSDevin Teske local prompt="$msg_save_exit_or_cancel" 1236f589320aSDevin Teske local menu_list # Calculated below 1237f589320aSDevin Teske local defaultitem="$1" 1238f589320aSDevin Teske local hline="$hline_arrows_tab_enter" 1239f589320aSDevin Teske 1240f589320aSDevin Teske # Attempt to convert numeric UNIX time to calendar date/time 1241f589320aSDevin Teske local user_account_expires_on= 1242f589320aSDevin Teske if f_isinteger "$user_account_expire"; then 1243f589320aSDevin Teske [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$( 1244f589320aSDevin Teske date -r "$user_account_expire" "+%F %T %Z" 1245f589320aSDevin Teske ) 1246f589320aSDevin Teske else 1247f589320aSDevin Teske user_account_expires_on="$user_account_expire" 1248f589320aSDevin Teske fi 1249f589320aSDevin Teske local user_password_expires_on= 1250f589320aSDevin Teske if f_isinteger "$user_password_expire"; then 1251f589320aSDevin Teske [ $user_password_expire -ne 0 ] && user_password_expires_on=$( 1252f589320aSDevin Teske date -r "$user_password_expire" "+%F %T %Z" 1253f589320aSDevin Teske ) 1254f589320aSDevin Teske else 1255f589320aSDevin Teske user_password_expires_on="$user_password_expire" 1256f589320aSDevin Teske fi 1257f589320aSDevin Teske 1258f589320aSDevin Teske # Localize potentially hostile variables and escape their values 1259f589320aSDevin Teske # to the local variable (see f_shell_escape() of `strings.subr') 1260f589320aSDevin Teske local var 1261f589320aSDevin Teske for var in account_expires_on class dotfiles_create gecos gid \ 1262f589320aSDevin Teske home_create home_dir member_groups name password_expires_on \ 1263f589320aSDevin Teske shell uid \ 1264f589320aSDevin Teske ; do 1265f589320aSDevin Teske local _user_$var 1266f589320aSDevin Teske eval f_shell_escape \"\$user_$var\" _user_$var 1267f589320aSDevin Teske done 1268f589320aSDevin Teske 1269*389e4940SDevin Teske # Attempt to translate a numeric GID into `number (name)' 1270*389e4940SDevin Teske if f_isinteger "$_user_gid"; then 1271*389e4940SDevin Teske local _user_group 1272*389e4940SDevin Teske _user_group=$( pw groupshow -g "$_user_gid" 2> /dev/null ) && 1273*389e4940SDevin Teske _user_group="${_user_group%%:*}" && 1274*389e4940SDevin Teske f_shell_escape "$_user_gid ($_user_group)" _user_gid 1275*389e4940SDevin Teske fi 1276*389e4940SDevin Teske 1277f589320aSDevin Teske menu_list=" 1278f589320aSDevin Teske 'X' '$msg_save/$msg_exit' 1279f589320aSDevin Teske '1' '$msg_login: $_user_name' 1280f589320aSDevin Teske '2' '$msg_full_name: $_user_gecos' 1281f589320aSDevin Teske '3' '$msg_password: -----' 1282f589320aSDevin Teske '4' '$msg_user_id: $_user_uid' 1283f589320aSDevin Teske '5' '$msg_group_id: $_user_gid' 1284f589320aSDevin Teske '6' '$msg_member_of_groups: $_user_member_groups' 1285f589320aSDevin Teske '7' '$msg_login_class: $_user_class' 1286f589320aSDevin Teske '8' '$msg_password_expires_on: $_user_password_expires_on' 1287f589320aSDevin Teske '9' '$msg_account_expires_on: $_user_account_expires_on' 1288f589320aSDevin Teske 'A' '$msg_home_directory: $_user_home_dir' 1289f589320aSDevin Teske 'B' '$msg_shell: $_user_shell' 1290f589320aSDevin Teske " # END-QUOTE 1291f589320aSDevin Teske case "$user_home_dir" in 1292f589320aSDevin Teske /|/nonexistent|/var/empty) menu_list="$menu_list 1293f589320aSDevin Teske '-' '$msg_create_home_directory: $msg_n_a' 1294f589320aSDevin Teske '-' '$msg_create_dotfiles: $msg_n_a' 1295f589320aSDevin Teske " # END-QUOTE 1296f589320aSDevin Teske ;; 1297f589320aSDevin Teske *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list 1298f589320aSDevin Teske '-' '$msg_create_home_directory: $msg_n_a' 1299f589320aSDevin Teske 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' 1300f589320aSDevin Teske " # END-QUOTE 1301f589320aSDevin Teske else menu_list="$menu_list 1302f589320aSDevin Teske 'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}' 1303f589320aSDevin Teske 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}' 1304f589320aSDevin Teske " # END-QUOTE 1305f589320aSDevin Teske fi 1306f589320aSDevin Teske esac 1307f589320aSDevin Teske 1308f589320aSDevin Teske local height width rows 1309f589320aSDevin Teske eval f_dialog_menu_size height width rows \ 1310f589320aSDevin Teske \"\$DIALOG_TITLE\" \ 1311f589320aSDevin Teske \"\$DIALOG_BACKTITLE\" \ 1312f589320aSDevin Teske \"\$prompt\" \ 1313f589320aSDevin Teske \"\$hline\" \ 1314f589320aSDevin Teske $menu_list 1315f589320aSDevin Teske 1316f589320aSDevin Teske local menu_choice 1317f589320aSDevin Teske menu_choice=$( eval $DIALOG \ 1318f589320aSDevin Teske --title \"\$DIALOG_TITLE\" \ 1319f589320aSDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 1320f589320aSDevin Teske --hline \"\$hline\" \ 1321f589320aSDevin Teske --ok-label \"\$msg_ok\" \ 1322f589320aSDevin Teske --cancel-label \"\$msg_cancel\" \ 1323f589320aSDevin Teske --default-item \"\$defaultitem\" \ 1324f589320aSDevin Teske --keep-tite \ 1325f589320aSDevin Teske --menu \"\$prompt\" \ 1326f589320aSDevin Teske $height $width $rows \ 1327f589320aSDevin Teske $menu_list \ 1328f589320aSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 1329f589320aSDevin Teske ) 1330f589320aSDevin Teske local retval=$? 1331f589320aSDevin Teske f_dialog_data_sanitize menu_choice 1332f589320aSDevin Teske f_dialog_menutag_store "$menu_choice" 1333f589320aSDevin Teske return $retval 1334ab2043b8SDevin Teske} 1335ab2043b8SDevin Teske 133656961fd7SDevin Teske############################################################ MAIN 133756961fd7SDevin Teske 133856961fd7SDevin Teskef_dprintf "%s: Successfully loaded." usermgmt/user_input.subr 133956961fd7SDevin Teske 1340ab2043b8SDevin Teskefi # ! $_USERMGMT_USER_INPUT_SUBR 1341