xref: /freebsd/usr.sbin/bsdconfig/usermgmt/share/group_input.subr (revision b00c7d1aa222b2376aed2d7762e9f2d18b02b7fb)
1ab2043b8SDevin Teskeif [ ! "$_USERMGMT_GROUP_INPUT_SUBR" ]; then _USERMGMT_GROUP_INPUT_SUBR=1
2ab2043b8SDevin Teske#
3ab2043b8SDevin Teske# Copyright (c) 2012 Ron McDowell
427c43fe1SDevin 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# $FreeBSD$
29ab2043b8SDevin Teske#
30ab2043b8SDevin Teske############################################################ INCLUDES
31ab2043b8SDevin Teske
32ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig"
33ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1
3456961fd7SDevin Teskef_dprintf "%s: loading includes..." usermgmt/group_input.subr
35ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr
36ab2043b8SDevin Teskef_include $BSDCFG_SHARE/strings.subr
37ab2043b8SDevin Teske
38ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="070.usermgmt"
39ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/include/messages.subr
40ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
41ab2043b8SDevin Teske
42ab2043b8SDevin Teske############################################################ FUNCTIONS
43ab2043b8SDevin Teske
44ab2043b8SDevin Teske# f_input_group $group
45ab2043b8SDevin Teske#
46ab2043b8SDevin Teske# Given $group name or id, create the environment variables group_name,
47ab2043b8SDevin Teske# group_gid, and group_members (and group_password is reset to NULL).
48ab2043b8SDevin Teske#
49ab2043b8SDevin Teskef_input_group()
50ab2043b8SDevin Teske{
5127c43fe1SDevin Teske	local funcname=f_input_group
5227c43fe1SDevin Teske	local group="$1"
5327c43fe1SDevin Teske
5427c43fe1SDevin Teske	f_dprintf "$funcname: Getting info for group \`%s'" "$group"
5527c43fe1SDevin Teske	eval "$( pw groupshow "$group" 2> /dev/null | awk -F: '
56*b00c7d1aSDevin Teske	function set_value(var, value) {
57*b00c7d1aSDevin Teske		gsub(/'\''/, "'\''\\'\'\''", value)
58*b00c7d1aSDevin Teske		printf "group_%s='\'%s\''\n", var, value
59*b00c7d1aSDevin Teske	}
60ab2043b8SDevin Teske	{
6127c43fe1SDevin Teske		found = $1 != ""
62*b00c7d1aSDevin Teske		set_value("name",     $1)
63*b00c7d1aSDevin Teske		set_value("password", "")
64*b00c7d1aSDevin Teske		set_value("gid",      $3)
65*b00c7d1aSDevin Teske		set_value("members",  $4)
66ab2043b8SDevin Teske		exit
6727c43fe1SDevin Teske	}
6827c43fe1SDevin Teske	END { if (!found) print "false" }' )"
69ab2043b8SDevin Teske}
70ab2043b8SDevin Teske
71d3a0f918SDevin Teske# f_dialog_menu_group_list [$default]
72ab2043b8SDevin Teske#
73d3a0f918SDevin Teske# Allows the user to select a group from a list. Optionally, if present and
74d3a0f918SDevin Teske# non-NULL, initially highlight $default group.
75ab2043b8SDevin Teske#
76ab2043b8SDevin Teskef_dialog_menu_group_list()
77ab2043b8SDevin Teske{
78052f8969SDevin Teske	local prompt=
79052f8969SDevin Teske	local menu_list="
80ab2043b8SDevin Teske		'X $msg_exit' ''
81ab2043b8SDevin Teske	" # END-QUOTE
82052f8969SDevin Teske	local defaultitem="$1"
83052f8969SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
84ab2043b8SDevin Teske
85ab2043b8SDevin Teske	# Add groups from group(5)
86ab2043b8SDevin Teske	menu_list="$menu_list $( pw groupshow -a | awk -F: '
87*b00c7d1aSDevin Teske		function mprint(tag, item) {
88*b00c7d1aSDevin Teske			gsub(/'\''/, "'\''\\'\'\''", tag)
89*b00c7d1aSDevin Teske			gsub(/'\''/, "'\''\\'\'\''", item)
90*b00c7d1aSDevin Teske			printf "'\'%s\'\ \'%s\''\n", tag, item
91*b00c7d1aSDevin Teske		}
92*b00c7d1aSDevin Teske		!/^[[:space:]]*(#|$)/ { mprint($1, $1) }
93*b00c7d1aSDevin Teske	' )"
94ab2043b8SDevin Teske
9574036c4dSDevin Teske	local height width rows
9674036c4dSDevin Teske	eval f_dialog_menu_size height width rows \
97ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
98ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
99052f8969SDevin Teske	                        \"\$prompt\"           \
100ab2043b8SDevin Teske	                        \"\$hline\"            \
10174036c4dSDevin Teske	                        $menu_list
102ab2043b8SDevin Teske
103fd962ac6SDevin Teske	local menu_choice
104fd962ac6SDevin Teske	menu_choice=$( eval $DIALOG \
105d3a0f918SDevin Teske		--title \"\$DIALOG_TITLE\"         \
106ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
107ab2043b8SDevin Teske		--hline \"\$hline\"                \
108ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
109ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
110d3a0f918SDevin Teske		--default-item \"\$defaultitem\"   \
111052f8969SDevin Teske		--menu \"\$prompt\"                \
11274036c4dSDevin Teske		$height $width $rows               \
11374036c4dSDevin Teske		$menu_list                         \
11489498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
11589498fdfSDevin Teske	)
11689498fdfSDevin Teske	local retval=$?
117fd962ac6SDevin Teske	f_dialog_menutag_store -s "$menu_choice"
11889498fdfSDevin Teske	return $retval
119ab2043b8SDevin Teske}
120ab2043b8SDevin Teske
12127c43fe1SDevin Teske# f_dialog_input_group_name $var_to_set [$group_name]
122ab2043b8SDevin Teske#
12327c43fe1SDevin Teske# Allows the user to enter a name for a new group. If the user does not cancel
12427c43fe1SDevin Teske# or press ESC, the $var_to_set variable will hold the newly-configured value
12527c43fe1SDevin Teske# upon return.
126ab2043b8SDevin Teske#
127ab2043b8SDevin Teskef_dialog_input_group_name()
128ab2043b8SDevin Teske{
12927c43fe1SDevin Teske	local __var_to_set="$1" __name="$2"
13027c43fe1SDevin Teske
131ab2043b8SDevin Teske	#
132ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
133ab2043b8SDevin Teske	#
13427c43fe1SDevin Teske	local __input="$__name"
135ab2043b8SDevin Teske	while :; do
136ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
13727c43fe1SDevin Teske		f_dialog_input __input "$msg_group" "$__input" \
138f677a9e2SDevin Teske		               "$hline_alnum_tab_enter" || return $?
139ab2043b8SDevin Teske
140ab2043b8SDevin Teske		# Check for no-change
14127c43fe1SDevin Teske		if [ "$__input" = "$__name" ]; then
14227c43fe1SDevin Teske			setvar "$__var_to_set" "$__input"
143f677a9e2SDevin Teske			return $DIALOG_OK
144ab2043b8SDevin Teske		fi
145ab2043b8SDevin Teske
146ab2043b8SDevin Teske		# Check for NULL entry
14727c43fe1SDevin Teske		if [ ! "$__input" ]; then
1487079fc4eSDevin Teske			f_show_msg "$msg_group_is_empty"
149ab2043b8SDevin Teske			continue
150ab2043b8SDevin Teske		fi
151ab2043b8SDevin Teske
152ab2043b8SDevin Teske		# Check for invalid entry
15327c43fe1SDevin Teske		case "$__input" in [!a-zA-Z]*)
1547079fc4eSDevin Teske			f_show_msg "$msg_group_must_start_with_letter"
155ab2043b8SDevin Teske			continue
15627c43fe1SDevin Teske		esac
157ab2043b8SDevin Teske
158ab2043b8SDevin Teske		# Check for duplicate entry
15927c43fe1SDevin Teske		if f_quietly pw groupshow -n "$__input"; then
16027c43fe1SDevin Teske			f_show_msg "$msg_group_already_used" "$__input"
161ab2043b8SDevin Teske			continue
162ab2043b8SDevin Teske		fi
163ab2043b8SDevin Teske
16427c43fe1SDevin Teske		setvar "$__var_to_set" "$__input"
165ab2043b8SDevin Teske		break
166ab2043b8SDevin Teske	done
167ab2043b8SDevin Teske
168f677a9e2SDevin Teske	return $DIALOG_OK
169ab2043b8SDevin Teske}
170ab2043b8SDevin Teske
17127c43fe1SDevin Teske# f_dialog_input_group_password $var_to_set $dvar_to_set
172ab2043b8SDevin Teske#
17327c43fe1SDevin Teske# Prompt the user to enter a password (twice). If the user does not cancel or
17427c43fe1SDevin Teske# press ESC, $var_to_set will hold the confirmed user entry. Otherwise, if the
17527c43fe1SDevin Teske# user cancels or enters a NULL password (twice), they are given the choice to
17627c43fe1SDevin Teske# disable password authentication for the given group, wherein $dvar_to_set has
17727c43fe1SDevin Teske# a value of 1 to indicate password authentication should be disabled.
178ab2043b8SDevin Teske#
179ab2043b8SDevin Teskef_dialog_input_group_password()
180ab2043b8SDevin Teske{
18127c43fe1SDevin Teske	local __var_to_set="$1" __dvar_to_set="$2"
18227c43fe1SDevin Teske	local __prompt1="$msg_group_password"
18327c43fe1SDevin Teske	local __prompt2="$msg_reenter_group_password"
18427c43fe1SDevin Teske	local __hline="$hline_alnum_punc_tab_enter"
185ab2043b8SDevin Teske
18627c43fe1SDevin Teske	local __height1 __width1
18727c43fe1SDevin Teske	f_dialog_inputbox_size __height1 __width1 \
188ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
189ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
19027c43fe1SDevin Teske	        	"$__prompt1"        \
191ab2043b8SDevin Teske	        	""                  \
19227c43fe1SDevin Teske	        	"$__hline"
193ab2043b8SDevin Teske
19427c43fe1SDevin Teske	local __height2 __width2
19527c43fe1SDevin Teske	f_dialog_inputbox_size __height2 __width2 \
196ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
197ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
19827c43fe1SDevin Teske	        	"$__prompt2"        \
199ab2043b8SDevin Teske	        	""                  \
20027c43fe1SDevin Teske	        	"$__hline"
201ab2043b8SDevin Teske
202ab2043b8SDevin Teske	#
203ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
204ab2043b8SDevin Teske	#
20527c43fe1SDevin Teske	local __retval __password1 __password2
206ab2043b8SDevin Teske	while :; do
20727c43fe1SDevin Teske		__password1=$( $DIALOG \
20874036c4dSDevin Teske			--title "$DIALOG_TITLE"         \
20974036c4dSDevin Teske			--backtitle "$DIALOG_BACKTITLE" \
21027c43fe1SDevin Teske			--hline "$__hline"              \
21174036c4dSDevin Teske			--ok-label "$msg_ok"            \
21274036c4dSDevin Teske			--cancel-label "$msg_cancel"    \
213ab2043b8SDevin Teske			--insecure                      \
21427c43fe1SDevin Teske			--passwordbox "$__prompt1"      \
21527c43fe1SDevin Teske			$__height1 $__width1            \
21689498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
21789498fdfSDevin Teske		)
21827c43fe1SDevin Teske		__retval=$?
21927c43fe1SDevin Teske		debug= f_dialog_line_sanitize __password1
220ab2043b8SDevin Teske
221ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
22227c43fe1SDevin Teske		[ $__retval -eq $DIALOG_OK ] || return $__retval
223ab2043b8SDevin Teske
22427c43fe1SDevin Teske		__password2=$( $DIALOG \
22574036c4dSDevin Teske			--title "$DIALOG_TITLE"         \
22674036c4dSDevin Teske			--backtitle "$DIALOG_BACKTITLE" \
22727c43fe1SDevin Teske			--hline "$__hline"              \
22874036c4dSDevin Teske			--ok-label "$msg_ok"            \
22974036c4dSDevin Teske			--cancel-label "$msg_cancel"    \
230ab2043b8SDevin Teske			--insecure                      \
23127c43fe1SDevin Teske			--passwordbox "$__prompt2"      \
23227c43fe1SDevin Teske			$__height2 $__width2            \
23389498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
23489498fdfSDevin Teske		)
23527c43fe1SDevin Teske		__retval=$?
23627c43fe1SDevin Teske		debug= f_dialog_line_sanitize __password2
237ab2043b8SDevin Teske
238ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
23927c43fe1SDevin Teske		[ $__retval -eq $DIALOG_OK ] || return $__retval
240ab2043b8SDevin Teske
241ab2043b8SDevin Teske		# Check for password mismatch
24227c43fe1SDevin Teske		if [ "$__password1" != "$__password2" ]; then
2437079fc4eSDevin Teske			f_show_msg "$msg_group_passwords_do_not_match"
244ab2043b8SDevin Teske			continue
245ab2043b8SDevin Teske		fi
246ab2043b8SDevin Teske
247ab2043b8SDevin Teske		# Check for NULL entry
24827c43fe1SDevin Teske		if [ ! "$__password1" ]; then
2497ca5c4cbSDevin Teske			f_dialog_yesno "$msg_disable_password_auth_for_group"
25027c43fe1SDevin Teske			__retval=$?
25127c43fe1SDevin Teske			if [ $__retval -eq $DIALOG_ESC ]; then
25227c43fe1SDevin Teske				return $__retval
25327c43fe1SDevin Teske			elif [ $__retval -eq $DIALOG_OK ]; then
25427c43fe1SDevin Teske				setvar "$__dvar_to_set" 1
255528318aeSDevin Teske			else
256350db065SDevin Teske				continue # back to password prompt
257528318aeSDevin Teske			fi
258ab2043b8SDevin Teske		else
25927c43fe1SDevin Teske			setvar "$__dvar_to_set" ""
260ab2043b8SDevin Teske		fi
261ab2043b8SDevin Teske
26227c43fe1SDevin Teske		setvar "$__var_to_set" "$__password1"
263ab2043b8SDevin Teske		break
264ab2043b8SDevin Teske	done
265ab2043b8SDevin Teske
266f677a9e2SDevin Teske	return $DIALOG_OK
267ab2043b8SDevin Teske}
268ab2043b8SDevin Teske
26927c43fe1SDevin Teske# f_dialog_input_group_gid $var_to_set [$group_gid]
270ab2043b8SDevin Teske#
271ab2043b8SDevin Teske# Allow the user to enter a new GID for a given group. If the user does not
27227c43fe1SDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured
273ab2043b8SDevin Teske# value upon return.
274ab2043b8SDevin Teske#
275ab2043b8SDevin Teskef_dialog_input_group_gid()
276ab2043b8SDevin Teske{
27727c43fe1SDevin Teske	local __var_to_set="$1" __input="$2"
278ab2043b8SDevin Teske
279ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
28027c43fe1SDevin Teske	f_dialog_input __input "$msg_group_id_leave_empty_for_default" \
28127c43fe1SDevin Teske	               "$__input" "$hline_num_tab_enter" || return $?
282ab2043b8SDevin Teske
28327c43fe1SDevin Teske	setvar "$__var_to_set" "$__input"
284f677a9e2SDevin Teske	return $DIALOG_OK
285ab2043b8SDevin Teske}
286ab2043b8SDevin Teske
28727c43fe1SDevin Teske# f_dialog_input_group_members $var_to_set [$group_members]
288ab2043b8SDevin Teske#
289f4844f65SDevin Teske# Allow the user to modify a list of members for a given group. If the user
29027c43fe1SDevin Teske# does not cancel or press ESC, the $var_to_set variable will hold the newly-
29127c43fe1SDevin Teske# configured value upon return.
292ab2043b8SDevin Teske#
293ab2043b8SDevin Teskef_dialog_input_group_members()
294ab2043b8SDevin Teske{
29527c43fe1SDevin Teske	local __var_to_set="$1" __input="$2"
29627c43fe1SDevin Teske	local __prompt="$msg_group_members:"
29727c43fe1SDevin Teske	local __menu_list="
298ab2043b8SDevin Teske		'X' '$msg_continue'
299ab2043b8SDevin Teske		'1' '$msg_select_group_members_from_list'
300ab2043b8SDevin Teske		'2' '$msg_enter_group_members_manually'
301ab2043b8SDevin Teske	" # END-QUOTE
30227c43fe1SDevin Teske	local __defaultitem=
30327c43fe1SDevin Teske	local __hline="$hline_num_arrows_tab_enter"
304ab2043b8SDevin Teske
30527c43fe1SDevin Teske	local __mheight __mwidth __mrows
30627c43fe1SDevin Teske	eval f_dialog_menu_size __mheight __mwidth __mrows \
30727c43fe1SDevin Teske	                        \"\$DIALOG_TITLE\"     \
30827c43fe1SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
30927c43fe1SDevin Teske	                        \"\$__prompt\"         \
31027c43fe1SDevin Teske	                        \"\$__hline\"          \
311072b47f3SDevin Teske	                        $__menu_list
31227c43fe1SDevin Teske
31327c43fe1SDevin Teske	local __menu_choice __retval
31427c43fe1SDevin Teske	while :; do
31527c43fe1SDevin Teske		__menu_choice=$( eval $DIALOG \
31627c43fe1SDevin Teske			--title \"\$DIALOG_TITLE\"         \
31727c43fe1SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
31827c43fe1SDevin Teske			--hline \"\$__hline\"              \
31927c43fe1SDevin Teske			--ok-label \"\$msg_ok\"            \
32027c43fe1SDevin Teske			--cancel-label \"\$msg_cancel\"    \
32127c43fe1SDevin Teske			--default-item \"\$__defaultitem\" \
32227c43fe1SDevin Teske			--menu \"\$__prompt\"              \
32327c43fe1SDevin Teske			$__mheight $__mwidth $__mrows      \
32427c43fe1SDevin Teske			$__menu_list                       \
32527c43fe1SDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
32627c43fe1SDevin Teske		)
32727c43fe1SDevin Teske		__retval=$?
32827c43fe1SDevin Teske		f_dialog_data_sanitize __menu_choice
32927c43fe1SDevin Teske		__defaultitem="$__menu_choice"
33027c43fe1SDevin Teske		f_dprintf "retval=%u menu_choice=[%s]" \
33127c43fe1SDevin Teske		          $__retval "$__menu_choice"
33227c43fe1SDevin Teske
33327c43fe1SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
33427c43fe1SDevin Teske		[ $__retval -eq $DIALOG_OK ] || return $__retval
33527c43fe1SDevin Teske
33627c43fe1SDevin Teske		local __group_members
33727c43fe1SDevin Teske		case "$__menu_choice" in
33827c43fe1SDevin Teske		X) # Exit
33927c43fe1SDevin Teske			break ;;
34027c43fe1SDevin Teske		1) # Select Group Members from a list
341*b00c7d1aSDevin Teske			local __check_list= # Calculated below
342*b00c7d1aSDevin Teske			local __user_list __u __user __length=0
34327c43fe1SDevin Teske			__user_list=$( pw usershow -a |
34427c43fe1SDevin Teske				awk -F: '!/^[[:space:]]*(#|$)/{print $1}' )
34527c43fe1SDevin Teske			while [ $__length -ne ${#__user_list} ]; do
346*b00c7d1aSDevin Teske				__u="${__user_list%%$NL*}" # First line
347*b00c7d1aSDevin Teske				f_shell_escape "$__u" __user
34827c43fe1SDevin Teske
34927c43fe1SDevin Teske				# Format of a checklist entry: tag item status
35027c43fe1SDevin Teske				__check_list="$__check_list '$__user' ''"
35127c43fe1SDevin Teske				case "$__input" in
352*b00c7d1aSDevin Teske				"$__u"|"$__u",*|*,"$__u",*|*,"$__u")
35327c43fe1SDevin Teske					__check_list="$__check_list on" ;;
35427c43fe1SDevin Teske				*)
35527c43fe1SDevin Teske					__check_list="$__check_list off"
35627c43fe1SDevin Teske				esac
35727c43fe1SDevin Teske
35827c43fe1SDevin Teske				__length=${#__user_list}
35927c43fe1SDevin Teske				__user_list="${__user_list#*$NL}" # Kill line
36027c43fe1SDevin Teske			done
36127c43fe1SDevin Teske
36227c43fe1SDevin Teske			local __cheight __cwidth __crows
36327c43fe1SDevin Teske			eval f_dialog_checklist_size \
36427c43fe1SDevin Teske				__cheight __cwidth __crows \
36527c43fe1SDevin Teske				\"\$DIALOG_TITLE\"     \
36627c43fe1SDevin Teske				\"\$DIALOG_BACKTITLE\" \
36727c43fe1SDevin Teske				\"\$__prompt\"         \
36827c43fe1SDevin Teske				\"\$__hline\"          \
36927c43fe1SDevin Teske				$__check_list
37027c43fe1SDevin Teske			__group_members=$( eval $DIALOG \
37127c43fe1SDevin Teske				--title \"\$DIALOG_TITLE\"         \
37227c43fe1SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
37327c43fe1SDevin Teske				--separate-output                  \
37427c43fe1SDevin Teske				--hline \"\$__hline\"              \
37527c43fe1SDevin Teske				--ok-label \"\$msg_ok\"            \
37627c43fe1SDevin Teske				--cancel-label \"\$msg_cancel\"    \
37727c43fe1SDevin Teske				--checklist \"\$__prompt\"         \
37827c43fe1SDevin Teske				$__cheight $__cwidth $__crows      \
37927c43fe1SDevin Teske				$__check_list                      \
38027c43fe1SDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
38127c43fe1SDevin Teske			) || continue
38227c43fe1SDevin Teske				# Return to previous menu if user either
38327c43fe1SDevin Teske				# pressed ESC or chose Cancel/No
38427c43fe1SDevin Teske			f_dialog_data_sanitize __group_members
38527c43fe1SDevin Teske
38627c43fe1SDevin Teske			#
38727c43fe1SDevin Teske			# Convert the newline separated list into a comma-
38827c43fe1SDevin Teske			# separated one so that if the user switches over to
38927c43fe1SDevin Teske			# manual editing, list reflects checklist selections
39027c43fe1SDevin Teske			#
39127c43fe1SDevin Teske			f_replaceall "$__group_members" "[$NL]" "," __input
39227c43fe1SDevin Teske			;;
39327c43fe1SDevin Teske		2) # Enter Group Members manually
39427c43fe1SDevin Teske			local __prompt2="$msg_group_members"
39527c43fe1SDevin Teske			__prompt2="$__prompt2 ($msg_separated_by_commas)"
39627c43fe1SDevin Teske
39727c43fe1SDevin Teske			f_dialog_input __group_members \
39827c43fe1SDevin Teske			               "$__prompt2" "$__input" \
39927c43fe1SDevin Teske			               "$hline_num_tab_enter" || continue
40027c43fe1SDevin Teske				# Return to previous menu if user either
40127c43fe1SDevin Teske				# pressed ESC or chose Cancel/No
40227c43fe1SDevin Teske
40327c43fe1SDevin Teske			__input="$__group_members"
40427c43fe1SDevin Teske			;;
40527c43fe1SDevin Teske		esac
40627c43fe1SDevin Teske	done
40727c43fe1SDevin Teske
40827c43fe1SDevin Teske	setvar "$__var_to_set" "$__input"
40927c43fe1SDevin Teske	return $DIALOG_OK
41027c43fe1SDevin Teske}
41127c43fe1SDevin Teske
41227c43fe1SDevin Teske# f_dialog_menu_group_add [$defaultitem]
41327c43fe1SDevin Teske#
41427c43fe1SDevin Teske# Present a menu detailing the properties of a group that is about to be added.
41527c43fe1SDevin Teske# The user's menu choice is available using f_dialog_menutag_fetch(). Returns
41627c43fe1SDevin Teske# success unless the user chose Cancel or pressed ESC. Data to display is taken
41727c43fe1SDevin Teske# from environment variables group_name, group_gid, and group_members. If
41827c43fe1SDevin Teske# $defaultitem is present and non-NULL, initially highlight the item in the
41927c43fe1SDevin Teske# menu.
42027c43fe1SDevin Teske#
42127c43fe1SDevin Teskef_dialog_menu_group_add()
42227c43fe1SDevin Teske{
42327c43fe1SDevin Teske	local prompt="$msg_save_exit_or_cancel"
42427c43fe1SDevin Teske	local menu_list # Calculated below
42527c43fe1SDevin Teske	local defaultitem="$1"
42627c43fe1SDevin Teske	local hline="$hline_arrows_tab_enter"
42727c43fe1SDevin Teske
428*b00c7d1aSDevin Teske	# Localize potentially hostile variables and escape their values
429*b00c7d1aSDevin Teske	# to the local variable (see f_shell_escape() of `strings.subr')
430*b00c7d1aSDevin Teske	local var
431*b00c7d1aSDevin Teske	for var in gid members name; do
432*b00c7d1aSDevin Teske		local _group_$var
433*b00c7d1aSDevin Teske		eval f_shell_escape \"\$group_$var\" _group_$var
434*b00c7d1aSDevin Teske	done
435*b00c7d1aSDevin Teske
43627c43fe1SDevin Teske	menu_list="
43727c43fe1SDevin Teske		'X' '$msg_add/$msg_exit'
438*b00c7d1aSDevin Teske		'1' '$msg_group: $_group_name'
43927c43fe1SDevin Teske		'2' '$msg_password: -----'
440*b00c7d1aSDevin Teske		'3' '$msg_group_id: $_group_gid'
441*b00c7d1aSDevin Teske		'4' '$msg_group_members: $_group_members'
44227c43fe1SDevin Teske	" # END-QUOTE
44327c43fe1SDevin Teske
44427c43fe1SDevin Teske	local height width rows
44527c43fe1SDevin Teske	eval f_dialog_menu_size height width rows \
446ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
447ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
448052f8969SDevin Teske	                        \"\$prompt\"           \
449ab2043b8SDevin Teske	                        \"\$hline\"            \
45074036c4dSDevin Teske	                        $menu_list
45174036c4dSDevin Teske
45227c43fe1SDevin Teske	local menu_choice
453fd962ac6SDevin Teske	menu_choice=$( eval $DIALOG \
454ab2043b8SDevin Teske		--title \"\$DIALOG_TITLE\"         \
455ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
456ab2043b8SDevin Teske		--hline \"\$hline\"                \
457ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
458ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
459d3a0f918SDevin Teske		--default-item \"\$defaultitem\"   \
460052f8969SDevin Teske		--menu \"\$prompt\"                \
46127c43fe1SDevin Teske		$height $width $rows               \
462ab2043b8SDevin Teske		$menu_list                         \
46389498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
46489498fdfSDevin Teske	)
46527c43fe1SDevin Teske	local retval=$?
466fd962ac6SDevin Teske	f_dialog_data_sanitize menu_choice
46727c43fe1SDevin Teske	f_dialog_menutag_store "$menu_choice"
46827c43fe1SDevin Teske	return $retval
46927c43fe1SDevin Teske}
470ab2043b8SDevin Teske
47127c43fe1SDevin Teske# f_dialog_menu_group_delete $group [$defaultitem]
47227c43fe1SDevin Teske#
47327c43fe1SDevin Teske# Present a menu detailing the properties of a group that is about to be
47427c43fe1SDevin Teske# deleted. The user's menu choice is available using f_dialog_menutag_fetch().
47527c43fe1SDevin Teske# Returns success unless the user chose Cancel or pressed ESC. Data to display
47627c43fe1SDevin Teske# is populated automatically from the system accounting database for the given
47727c43fe1SDevin Teske# $group argument. If $defaultitem is present and non-NULL, initially highlight
47827c43fe1SDevin Teske# the item in the menu.
47927c43fe1SDevin Teske#
48027c43fe1SDevin Teskef_dialog_menu_group_delete()
48127c43fe1SDevin Teske{
48227c43fe1SDevin Teske	local prompt="$msg_delete_exit_or_cancel"
48327c43fe1SDevin Teske	local menu_list # Calculated below
48427c43fe1SDevin Teske	local defaultitem="$2"
48527c43fe1SDevin Teske	local hline="$hline_arrows_tab_enter"
486ab2043b8SDevin Teske
48727c43fe1SDevin Teske	local group_name group_password group_gid group_members
48827c43fe1SDevin Teske	f_input_group "$1"
489ab2043b8SDevin Teske
490*b00c7d1aSDevin Teske	# Localize potentially hostile variables and escape their values
491*b00c7d1aSDevin Teske	# to the local variable (see f_shell_escape() of `strings.subr')
492*b00c7d1aSDevin Teske	local var
493*b00c7d1aSDevin Teske	for var in gid members name; do
494*b00c7d1aSDevin Teske		local _group_$var
495*b00c7d1aSDevin Teske		eval f_shell_escape \"\$group_$var\" _group_$var
496*b00c7d1aSDevin Teske	done
497*b00c7d1aSDevin Teske
49827c43fe1SDevin Teske	menu_list="
49927c43fe1SDevin Teske		'X' '$msg_delete/$msg_exit'
500*b00c7d1aSDevin Teske		'1' '$msg_group: $_group_name'
50127c43fe1SDevin Teske		'-' '$msg_password: -----'
502*b00c7d1aSDevin Teske		'-' '$msg_group_id: $_group_gid'
503*b00c7d1aSDevin Teske		'-' '$msg_group_members: $_group_members'
50427c43fe1SDevin Teske	" # END-QUOTE
50527c43fe1SDevin Teske
50627c43fe1SDevin Teske	local height width rows
50727c43fe1SDevin Teske	eval f_dialog_menu_size height width rows \
508ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
509ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
510052f8969SDevin Teske	                        \"\$prompt\"           \
511ab2043b8SDevin Teske	                        \"\$hline\"            \
51227c43fe1SDevin Teske	                        $menu_list
51327c43fe1SDevin Teske
51427c43fe1SDevin Teske	local menu_choice
51527c43fe1SDevin Teske	menu_choice=$( eval $DIALOG \
516ab2043b8SDevin Teske		--title \"\$DIALOG_TITLE\"         \
517ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
518ab2043b8SDevin Teske		--hline \"\$hline\"                \
519ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
520ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
52127c43fe1SDevin Teske		--default-item \"\$defaultitem\"   \
52227c43fe1SDevin Teske		--menu \"\$prompt\"                \
52327c43fe1SDevin Teske		$height $width $rows               \
52427c43fe1SDevin Teske		$menu_list                         \
52589498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
52627c43fe1SDevin Teske	)
52727c43fe1SDevin Teske	local retval=$?
52827c43fe1SDevin Teske	f_dialog_data_sanitize menu_choice
52927c43fe1SDevin Teske	f_dialog_menutag_store "$menu_choice"
53027c43fe1SDevin Teske	return $retval
53127c43fe1SDevin Teske}
532ab2043b8SDevin Teske
53327c43fe1SDevin Teske# f_dialog_menu_group_edit [$defaultitem]
534d4ae33f0SDevin Teske#
53527c43fe1SDevin Teske# Present a menu detailing the properties of a group that is about to be
53627c43fe1SDevin Teske# modified. The user's menu choice is available using f_dialog_menutag_fetch().
53727c43fe1SDevin Teske# Returns success unless the user chose Cancel or pressed ESC. Data to display
53827c43fe1SDevin Teske# is taken from environment variables group_name, group_gid, and group_members.
53927c43fe1SDevin Teske# If $defaultitem is present and non-NULL, initially highlight the item in the
54027c43fe1SDevin Teske# menu.
541d4ae33f0SDevin Teske#
54227c43fe1SDevin Teskef_dialog_menu_group_edit()
54327c43fe1SDevin Teske{
54427c43fe1SDevin Teske	local prompt="$msg_save_exit_or_cancel"
54527c43fe1SDevin Teske	local menu_list # Calculated below
54627c43fe1SDevin Teske	local defaultitem="$1"
54727c43fe1SDevin Teske	local hline="$hline_arrows_tab_enter"
548ab2043b8SDevin Teske
549*b00c7d1aSDevin Teske	# Localize potentially hostile variables and escape their values
550*b00c7d1aSDevin Teske	# to the local variable (see f_shell_escape() of `strings.subr')
551*b00c7d1aSDevin Teske	local var
552*b00c7d1aSDevin Teske	for var in gid members name; do
553*b00c7d1aSDevin Teske		local _group_$var
554*b00c7d1aSDevin Teske		eval f_shell_escape \"\$group_$var\" _group_$var
555*b00c7d1aSDevin Teske	done
556*b00c7d1aSDevin Teske
55727c43fe1SDevin Teske	menu_list="
55827c43fe1SDevin Teske		'X' '$msg_save/$msg_exit'
559*b00c7d1aSDevin Teske		'1' '$msg_group: $_group_name'
56027c43fe1SDevin Teske		'2' '$msg_password: -----'
561*b00c7d1aSDevin Teske		'3' '$msg_group_id: $_group_gid'
562*b00c7d1aSDevin Teske		'4' '$msg_group_members: $_group_members'
56327c43fe1SDevin Teske	" # END-QUOTE
564ab2043b8SDevin Teske
56527c43fe1SDevin Teske	local height width rows
56627c43fe1SDevin Teske	eval f_dialog_menu_size height width rows \
56727c43fe1SDevin Teske	                        \"\$DIALOG_TITLE\"     \
56827c43fe1SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
56927c43fe1SDevin Teske	                        \"\$prompt\"           \
57027c43fe1SDevin Teske	                        \"\$hline\"            \
57127c43fe1SDevin Teske	                        $menu_list
572ab2043b8SDevin Teske
57327c43fe1SDevin Teske	local menu_choice
57427c43fe1SDevin Teske	menu_choice=$( eval $DIALOG \
57527c43fe1SDevin Teske		--title \"\$DIALOG_TITLE\"         \
57627c43fe1SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
57727c43fe1SDevin Teske		--hline \"\$hline\"                \
57827c43fe1SDevin Teske		--ok-label \"\$msg_ok\"            \
57927c43fe1SDevin Teske		--cancel-label \"\$msg_cancel\"    \
58027c43fe1SDevin Teske		--default-item \"\$defaultitem\"   \
58127c43fe1SDevin Teske		--menu \"\$prompt\"                \
58227c43fe1SDevin Teske		$height $width $rows               \
58327c43fe1SDevin Teske		$menu_list                         \
58427c43fe1SDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
58527c43fe1SDevin Teske	)
58627c43fe1SDevin Teske	local retval=$?
58727c43fe1SDevin Teske	f_dialog_data_sanitize menu_choice
58827c43fe1SDevin Teske	f_dialog_menutag_store "$menu_choice"
58927c43fe1SDevin Teske	return $retval
590ab2043b8SDevin Teske}
591ab2043b8SDevin Teske
59256961fd7SDevin Teske############################################################ MAIN
59356961fd7SDevin Teske
59456961fd7SDevin Teskef_dprintf "%s: Successfully loaded." usermgmt/group_input.subr
59556961fd7SDevin Teske
596ab2043b8SDevin Teskefi # ! $_USERMGMT_GROUP_INPUT_SUBR
597