group_input.subr revision 240768
1238438Sdteskeif [ ! "$_USERMGMT_GROUP_INPUT_SUBR" ]; then _USERMGMT_GROUP_INPUT_SUBR=1 2238438Sdteske# 3238438Sdteske# Copyright (c) 2012 Ron McDowell 4238438Sdteske# Copyright (c) 2012 Devin Teske 5238438Sdteske# All rights reserved. 6238438Sdteske# 7238438Sdteske# Redistribution and use in source and binary forms, with or without 8238438Sdteske# modification, are permitted provided that the following conditions 9238438Sdteske# are met: 10238438Sdteske# 1. Redistributions of source code must retain the above copyright 11238438Sdteske# notice, this list of conditions and the following disclaimer. 12238438Sdteske# 2. Redistributions in binary form must reproduce the above copyright 13238438Sdteske# notice, this list of conditions and the following disclaimer in the 14238438Sdteske# documentation and/or other materials provided with the distribution. 15238438Sdteske# 16238438Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17238438Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18238438Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19238438Sdteske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20238438Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21238438Sdteske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22238438Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23238438Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24238438Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25238438Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26238438Sdteske# SUCH DAMAGE. 27238438Sdteske# 28238438Sdteske# $FreeBSD: head/usr.sbin/bsdconfig/usermgmt/share/group_input.subr 240768 2012-09-20 23:44:13Z dteske $ 29238438Sdteske# 30238438Sdteske############################################################ INCLUDES 31238438Sdteske 32240684SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 33240684Sdteske. $BSDCFG_SHARE/common.subr || exit 1 34240684Sdteskef_include $BSDCFG_SHARE/dialog.subr 35240684Sdteskef_include $BSDCFG_SHARE/strings.subr 36240684Sdteske 37240684SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="070.usermgmt" 38238438Sdteskef_include_lang $BSDCFG_LIBE/include/messages.subr 39238438Sdteskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 40238438Sdteske 41238438Sdteske############################################################ FUNCTIONS 42238438Sdteske 43238438Sdteske# f_input_group $group 44238438Sdteske# 45238438Sdteske# Given $group name or id, create the environment variables group_name, 46238438Sdteske# group_gid, and group_members (and group_password is reset to NULL). 47238438Sdteske# 48238438Sdteskef_input_group() 49238438Sdteske{ 50238438Sdteske eval $( pw groupshow "$1" | awk -F: ' 51238438Sdteske { 52238438Sdteske printf "group_name='\'%s\''\n", $1 53238438Sdteske printf "group_password=\n" 54238438Sdteske printf "group_gid='\'%s\''\n", $3 55238438Sdteske printf "group_members='\'%s\''\n", $4 56238438Sdteske exit 57238438Sdteske }' ) 58238438Sdteske} 59238438Sdteske 60238438Sdteske# f_dialog_menu_group_list 61238438Sdteske# 62238438Sdteske# Allows the user to select a group from a list. 63238438Sdteske# 64238438Sdteskef_dialog_menu_group_list() 65238438Sdteske{ 66238438Sdteske local menu_list size 67238438Sdteske local hline="$hline_alnum_punc_tab_enter" 68238438Sdteske 69238438Sdteske menu_list=" 70238438Sdteske 'X $msg_exit' '' 71238438Sdteske " # END-QUOTE 72238438Sdteske 73238438Sdteske # Add groups from group(5) 74238438Sdteske menu_list="$menu_list $( pw groupshow -a | awk -F: ' 75238438Sdteske !/^[[:space:]]*(#|$)/ { 76238438Sdteske printf "'\'%s\'\ \'%s\''\n", $1, $1 77238438Sdteske }' 78238438Sdteske )" 79238438Sdteske 80238438Sdteske size=$( eval f_dialog_menu_size \ 81238438Sdteske \"\$DIALOG_TITLE\" \ 82238438Sdteske \"\$DIALOG_BACKTITLE\" \ 83238438Sdteske \"\" \ 84238438Sdteske \"\$hline\" \ 85238438Sdteske $menu_list ) 86238438Sdteske 87240768Sdteske local dialog_menu 88240768Sdteske dialog_menu=$( eval $DIALOG \ 89238438Sdteske --clear --title \"\$DIALOG_TITLE\" \ 90238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 91238438Sdteske --hline \"\$hline\" \ 92238438Sdteske --ok-label \"\$msg_ok\" \ 93238438Sdteske --cancel-label \"\$msg_cancel\" \ 94238438Sdteske --menu \"\" $size $menu_list \ 95240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 96240768Sdteske ) 97240768Sdteske local retval=$? 98240768Sdteske setvar DIALOG_MENU_$$ "$dialog_menu" 99240768Sdteske return $retval 100238438Sdteske} 101238438Sdteske 102238438Sdteske# f_dialog_input_group_name [$group_name] 103238438Sdteske# 104238438Sdteske# Allows the user to enter a new groupname for a given group. If the user does 105238438Sdteske# not cancel or press ESC, the $group_name variable will hold the 106238438Sdteske# newly-configured value upon return. 107238438Sdteske# 108238438Sdteske# If $cur_group_name is defined, the user can enter that and by-pass error- 109238438Sdteske# checking (allowing the user to "revert" to an old value without, for example, 110238438Sdteske# being told that the groupname already exists). 111238438Sdteske# 112238438Sdteskef_dialog_input_group_name() 113238438Sdteske{ 114238438Sdteske local msg="$( printf "$msg_group" )" 115238438Sdteske local hline="$hline_alnum_tab_enter" 116238438Sdteske 117238438Sdteske # 118238438Sdteske # Loop until the user provides taint-free/valid input 119238438Sdteske # 120238438Sdteske local size retval _name="$1" _input="$1" 121238438Sdteske while :; do 122238438Sdteske size=$( f_dialog_inputbox_size \ 123238438Sdteske "$DIALOG_TITLE" \ 124238438Sdteske "$DIALOG_BACKTITLE" \ 125238438Sdteske "$msg" \ 126238438Sdteske "$_input" \ 127238438Sdteske "$hline" ) 128238438Sdteske 129240768Sdteske local dialog_inputbox 130240768Sdteske dialog_inputbox=$( eval $DIALOG \ 131238438Sdteske --title \"\$DIALOG_TITLE\" \ 132238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 133238438Sdteske --hline \"\$hline\" \ 134238438Sdteske --ok-label \"\$msg_ok\" \ 135238438Sdteske --cancel-label \"\$msg_cancel\" \ 136238438Sdteske --inputbox \"\$msg\" $size \ 137238438Sdteske \"\$_input\" \ 138240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 139240768Sdteske ) 140238438Sdteske 141238438Sdteske retval=$? 142240768Sdteske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 143238438Sdteske _input=$( f_dialog_inputstr ) 144238438Sdteske 145238438Sdteske # Return if user has either pressed ESC or chosen Cancel/No 146238438Sdteske [ $retval -eq $SUCCESS ] || return $retval 147238438Sdteske 148238438Sdteske # Check for no-change 149238438Sdteske [ "$_input" = "$_name" ] && return $SUCCESS 150238438Sdteske 151238438Sdteske # Check for reversion 152238438Sdteske if [ "$_input" = "$cur_group_name" ]; then 153238438Sdteske group_name="$cur_group_name" 154238438Sdteske return $SUCCESS 155238438Sdteske fi 156238438Sdteske 157238438Sdteske # Check for NULL entry 158238438Sdteske if [ ! "$_input" ]; then 159238438Sdteske f_show_msg "$msg_group_is_empty" 160238438Sdteske continue 161238438Sdteske fi 162238438Sdteske 163238438Sdteske # Check for invalid entry 164238438Sdteske if ! echo "$_input" | grep -q "^[[:alpha:]]"; then 165238438Sdteske f_show_msg "$msg_group_must_start_with_letter" 166238438Sdteske continue 167238438Sdteske fi 168238438Sdteske 169238438Sdteske # Check for duplicate entry 170238438Sdteske if f_quietly pw groupshow -n "$_input"; then 171238438Sdteske f_show_msg "$msg_group_already_used" "$_input" 172238438Sdteske continue 173238438Sdteske fi 174238438Sdteske 175238438Sdteske group_name="$_input" 176238438Sdteske break 177238438Sdteske done 178238438Sdteske save_flag=1 179238438Sdteske 180238438Sdteske f_dprintf "group_name: [$cur_group_name]->[$group_name]" 181238438Sdteske 182238438Sdteske return $SUCCESS 183238438Sdteske} 184238438Sdteske 185238438Sdteske# f_dialog_input_group_password 186238438Sdteske# 187238438Sdteske# Prompt the user to enter a password (twice). 188238438Sdteske# 189238438Sdteskef_dialog_input_group_password() 190238438Sdteske{ 191238438Sdteske local hline="$hline_alnum_punc_tab_enter" 192238438Sdteske local msg size rmsg rsize 193238438Sdteske 194238438Sdteske msg=$( printf "$msg_group_password" ) 195238438Sdteske size=$( f_dialog_inputbox_size \ 196238438Sdteske "$DIALOG_TITLE" \ 197238438Sdteske "$DIALOG_BACKTITLE" \ 198238438Sdteske "$msg" \ 199238438Sdteske "" \ 200238438Sdteske "$hline" ) 201238438Sdteske 202238438Sdteske rmsg=$( printf "$msg_reenter_group_password" ) 203238438Sdteske rsize=$( f_dialog_inputbox_size \ 204238438Sdteske "$DIALOG_TITLE" \ 205238438Sdteske "$DIALOG_BACKTITLE" \ 206238438Sdteske "$rmsg" \ 207238438Sdteske "" \ 208238438Sdteske "$hline" ) 209238438Sdteske 210238438Sdteske # 211238438Sdteske # Loop until the user provides taint-free/valid input 212238438Sdteske # 213238438Sdteske local retval _password1 _password2 214238438Sdteske while :; do 215240768Sdteske local dialog_inputbox 216240768Sdteske dialog_inputbox=$( eval $DIALOG \ 217238438Sdteske --title \"\$DIALOG_TITLE\" \ 218238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 219238438Sdteske --hline \"\$hline\" \ 220238438Sdteske --ok-label \"\$msg_ok\" \ 221238438Sdteske --cancel-label \"\$msg_cancel\" \ 222238438Sdteske --insecure \ 223238438Sdteske --passwordbox \"\$msg\" $size \ 224240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 225240768Sdteske ) 226238438Sdteske 227238438Sdteske retval=$? 228240768Sdteske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 229238438Sdteske _password1=$( f_dialog_inputstr ) 230238438Sdteske 231238438Sdteske # Return if user has either pressed ESC or chosen Cancel/No 232238438Sdteske [ $retval -eq $SUCCESS ] || return $retval 233238438Sdteske 234240768Sdteske dialog_inputbox=$( eval $DIALOG \ 235238438Sdteske --title \"\$DIALOG_TITLE\" \ 236238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 237238438Sdteske --hline \"\$hline\" \ 238238438Sdteske --ok-label \"\$msg_ok\" \ 239238438Sdteske --cancel-label \"\$msg_cancel\" \ 240238438Sdteske --insecure \ 241238438Sdteske --passwordbox \"\$rmsg\" $rsize \ 242240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 243240768Sdteske ) 244238438Sdteske 245238438Sdteske retval=$? 246240768Sdteske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 247238438Sdteske _password2=$( f_dialog_inputstr ) 248238438Sdteske 249238438Sdteske # Return if user has either pressed ESC or chosen Cancel/No 250238438Sdteske [ $retval -eq $SUCCESS ] || return $retval 251238438Sdteske 252238438Sdteske # Check for password mismatch 253238438Sdteske if [ "$_password1" != "$_password2" ]; then 254238438Sdteske f_show_msg "$msg_group_passwords_do_not_match" 255238438Sdteske continue 256238438Sdteske fi 257238438Sdteske 258238438Sdteske # Check for NULL entry 259238438Sdteske if [ ! "$_password1" ]; then 260238438Sdteske f_dialog_yesno \ 261238438Sdteske "$msg_disable_password_auth_for_group" || 262238438Sdteske continue 263238438Sdteske pw_group_password_disable=1 264238438Sdteske else 265238438Sdteske pw_group_password_disable= 266238438Sdteske fi 267238438Sdteske 268238438Sdteske group_password="$_password1" 269238438Sdteske break 270238438Sdteske done 271238438Sdteske save_flag=1 272238438Sdteske 273238438Sdteske f_dprintf "group_password: [$cur_group_password]->[$group_password]" 274238438Sdteske 275238438Sdteske return $SUCCESS 276238438Sdteske} 277238438Sdteske 278238438Sdteske# f_dialog_input_group_gid [$group_gid] 279238438Sdteske# 280238438Sdteske# Allow the user to enter a new GID for a given group. If the user does not 281238438Sdteske# cancel or press ESC, the $group_gid variable will hold the newly-configured 282238438Sdteske# value upon return. 283238438Sdteske# 284238438Sdteskef_dialog_input_group_gid() 285238438Sdteske{ 286238438Sdteske local msg size retval _input="$1" 287238438Sdteske local hline="$hline_num_tab_enter" 288238438Sdteske 289238438Sdteske msg=$( printf "$msg_group_id_leave_empty_for_default" ) 290238438Sdteske size=$( f_dialog_inputbox_size \ 291238438Sdteske "$DIALOG_TITLE" \ 292238438Sdteske "$DIALOG_BACKTITLE" \ 293238438Sdteske "$msg" \ 294238438Sdteske "$_input" \ 295238438Sdteske "$hline" ) 296238438Sdteske 297240768Sdteske local dialog_inputbox 298240768Sdteske dialog_inputbox=$( eval $DIALOG \ 299238438Sdteske --title \"\$DIALOG_TITLE\" \ 300238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 301238438Sdteske --hline \"\$hline\" \ 302238438Sdteske --ok-label \"\$msg_ok\" \ 303238438Sdteske --cancel-label \"\$msg_cancel\" \ 304238438Sdteske --inputbox \"\$msg\" $size \ 305238438Sdteske \"\$_input\" \ 306240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 307240768Sdteske ) 308238438Sdteske 309238438Sdteske retval=$? 310240768Sdteske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 311238438Sdteske _input=$( f_dialog_inputstr ) 312238438Sdteske 313238438Sdteske # Return if user has either pressed ESC or chosen Cancel/No 314238438Sdteske [ $retval -eq $SUCCESS ] || return $retval 315238438Sdteske 316238438Sdteske group_gid="$_input" 317238438Sdteske save_flag=1 318238438Sdteske 319238438Sdteske f_dprintf "group_gid: [$cur_group_gid]->[$group_gid]" 320238438Sdteske 321238438Sdteske return $SUCCESS 322238438Sdteske} 323238438Sdteske 324238438Sdteske# f_dialog_input_group_members [$group_members] 325238438Sdteske# 326238438Sdteske# Allow the user to modify a list of members for a given group. If the user does 327238438Sdteske# not cancel or press ESC, the $group_members variable will hold the newly- 328238438Sdteske# configured value upon return. 329238438Sdteske# 330238438Sdteskef_dialog_input_group_members() 331238438Sdteske{ 332238438Sdteske local menu_choice msg size retval _input="$1" 333238438Sdteske local hline="$hline_num_arrows_tab_enter" 334238438Sdteske local user 335238438Sdteske local menu_list 336238438Sdteske local all_users_valid 337238438Sdteske local _group_members 338238438Sdteske local checklist_users 339238438Sdteske 340238438Sdteske menu_list=" 341238438Sdteske 'X' '$msg_continue' 342238438Sdteske '1' '$msg_select_group_members_from_list' 343238438Sdteske '2' '$msg_enter_group_members_manually' 344238438Sdteske " # END-QUOTE 345238438Sdteske 346240768Sdteske local dialog_menu 347238438Sdteske while :; do 348238438Sdteske msg="$msg_group_members:" 349238438Sdteske menu_size=$( eval f_dialog_menu_size \ 350238438Sdteske \"\$DIALOG_TITLE\" \ 351238438Sdteske \"\$DIALOG_BACKTITLE\" \ 352238438Sdteske \"\$msg\" \ 353238438Sdteske \"\$hline\" \ 354238438Sdteske $menu_list ) 355240768Sdteske dialog_menu=$( eval $DIALOG \ 356238438Sdteske --title \"\$DIALOG_TITLE\" \ 357238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 358238438Sdteske --hline \"\$hline\" \ 359238438Sdteske --ok-label \"\$msg_ok\" \ 360238438Sdteske --cancel-label \"\$msg_cancel\" \ 361238438Sdteske --menu \"\$msg\" $menu_size \ 362238438Sdteske $menu_list \ 363240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 364240768Sdteske ) 365238438Sdteske retval=$? 366240768Sdteske setvar DIALOG_MENU_$$ "$dialog_menu" 367238438Sdteske menu_choice=$( f_dialog_menutag ) 368238438Sdteske f_dprintf "retval=$retval menu_choice=[$menu_choice]" 369238438Sdteske 370238438Sdteske # Return if user has either pressed ESC or chosen Cancel/No 371238438Sdteske [ $retval -eq $SUCCESS ] || return $retval 372238438Sdteske 373238438Sdteske case "$menu_choice" in 374238438Sdteske X) # Exit 375238438Sdteske break ;; 376238438Sdteske 1) # Select Group Members from a list 377238438Sdteske user_list=$( pw usershow -a | awk -F: ' 378238438Sdteske !/^[[:space:]]*(#|$)/ { printf "%s\n", $1 }' ) 379238438Sdteske checklist_users= 380238438Sdteske for user in $user_list; do 381238438Sdteske checklist_users="$checklist_users $user \"\"" 382238438Sdteske if echo "$_input" | grep -q "\<$user\>"; then 383238438Sdteske checklist_users="$checklist_users on" 384238438Sdteske else 385238438Sdteske checklist_users="$checklist_users off" 386238438Sdteske fi 387238438Sdteske done 388238438Sdteske 389238438Sdteske size=$( eval f_dialog_radiolist_size \ 390238438Sdteske \"\$DIALOG_TITLE\" \ 391238438Sdteske \"\$DIALOG_BACKTITLE\" \ 392238438Sdteske \"\" \ 393238438Sdteske \"\$hline\" \ 394238438Sdteske $checklist_users ) 395240768Sdteske local dialog_inputbox 396240768Sdteske dialog_inputbox=$( eval $DIALOG \ 397238438Sdteske --title \"\$DIALOG_TITLE\" \ 398238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 399238438Sdteske --separate-output \ 400238438Sdteske --hline \"\$hline\" \ 401238438Sdteske --ok-label \"\$msg_ok\" \ 402238438Sdteske --cancel-label \"\$msg_cancel\" \ 403238438Sdteske --checklist \"\$msg\" $size \ 404238438Sdteske $checklist_users \ 405240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 406240768Sdteske ) 407238438Sdteske retval=$? 408240768Sdteske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 409238438Sdteske _group_members=$( f_dialog_inputstr | tr '\n' ' ' | 410238438Sdteske sed -e 's/[[:space:]]\{1,\}/,/g;s/^,//;s/,$//' ) 411238438Sdteske 412238438Sdteske # Return to previous menu if user has either 413238438Sdteske # pressed ESC or chosen Cancel/No 414238438Sdteske [ $retval -eq $SUCCESS ] || continue 415238438Sdteske 416238438Sdteske _input="$_group_members" 417238438Sdteske ;; 418238438Sdteske 2) # Enter Group Members manually 419238438Sdteske hline="$hline_num_tab_enter" 420238438Sdteske msg=$( 421238438Sdteske printf "$msg_group_members ($msg_separated_by_commas)" 422238438Sdteske ) 423238438Sdteske size=$( f_dialog_inputbox_size \ 424238438Sdteske "$DIALOG_TITLE" \ 425238438Sdteske "$DIALOG_BACKTITLE" \ 426238438Sdteske "$msg" \ 427238438Sdteske "$_input" \ 428238438Sdteske "$hline" ) 429238438Sdteske 430240768Sdteske local dialog_inputbox 431240768Sdteske dialog_inputbox=$( eval $DIALOG \ 432238438Sdteske --title \"\$DIALOG_TITLE\" \ 433238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 434238438Sdteske --hline \"\$hline\" \ 435238438Sdteske --ok-label \"\$msg_ok\" \ 436238438Sdteske --cancel-label \"\$msg_cancel\" \ 437238438Sdteske --inputbox \"\$msg\" $size \ 438238438Sdteske \"\$_input\" \ 439240768Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 440240768Sdteske ) 441238438Sdteske 442238438Sdteske retval=$? 443240768Sdteske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 444238438Sdteske _group_members=$( f_dialog_inputstr ) 445238438Sdteske 446238438Sdteske # Return to previous menu if user has either 447238438Sdteske # pressed ESC or chosen Cancel/No 448238438Sdteske [ $retval -eq $SUCCESS ] || continue 449238438Sdteske 450238438Sdteske _input="$_group_members" 451238438Sdteske ;; 452238438Sdteske esac 453238438Sdteske done 454238438Sdteske 455238438Sdteske group_members="$_input" 456238438Sdteske save_flag=1 457238438Sdteske f_dprintf "group_members: [$cur_group_members]->[$group_members]" 458238438Sdteske 459238438Sdteske return $SUCCESS 460238438Sdteske} 461238438Sdteske 462238438Sdteskefi # ! $_USERMGMT_GROUP_INPUT_SUBR 463