xref: /freebsd/usr.sbin/bsdconfig/usermgmt/share/group_input.subr (revision ab2043b81eaba0d7d7769b4a58b2b6d17bc464a3)
1*ab2043b8SDevin Teskeif [ ! "$_USERMGMT_GROUP_INPUT_SUBR" ]; then _USERMGMT_GROUP_INPUT_SUBR=1
2*ab2043b8SDevin Teske#
3*ab2043b8SDevin Teske# Copyright (c) 2012 Ron McDowell
4*ab2043b8SDevin Teske# Copyright (c) 2012 Devin Teske
5*ab2043b8SDevin Teske# All rights reserved.
6*ab2043b8SDevin Teske#
7*ab2043b8SDevin Teske# Redistribution and use in source and binary forms, with or without
8*ab2043b8SDevin Teske# modification, are permitted provided that the following conditions
9*ab2043b8SDevin Teske# are met:
10*ab2043b8SDevin Teske# 1. Redistributions of source code must retain the above copyright
11*ab2043b8SDevin Teske#    notice, this list of conditions and the following disclaimer.
12*ab2043b8SDevin Teske# 2. Redistributions in binary form must reproduce the above copyright
13*ab2043b8SDevin Teske#    notice, this list of conditions and the following disclaimer in the
14*ab2043b8SDevin Teske#    documentation and/or other materials provided with the distribution.
15*ab2043b8SDevin Teske#
16*ab2043b8SDevin Teske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*ab2043b8SDevin Teske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*ab2043b8SDevin Teske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*ab2043b8SDevin Teske# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*ab2043b8SDevin Teske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*ab2043b8SDevin Teske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*ab2043b8SDevin Teske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*ab2043b8SDevin Teske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*ab2043b8SDevin Teske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*ab2043b8SDevin Teske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*ab2043b8SDevin Teske# SUCH DAMAGE.
27*ab2043b8SDevin Teske#
28*ab2043b8SDevin Teske# $FreeBSD$
29*ab2043b8SDevin Teske#
30*ab2043b8SDevin Teske############################################################ INCLUDES
31*ab2043b8SDevin Teske
32*ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig"
33*ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1
34*ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr
35*ab2043b8SDevin Teskef_include $BSDCFG_SHARE/strings.subr
36*ab2043b8SDevin Teske
37*ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="070.usermgmt"
38*ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/include/messages.subr
39*ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40*ab2043b8SDevin Teske
41*ab2043b8SDevin Teske############################################################ FUNCTIONS
42*ab2043b8SDevin Teske
43*ab2043b8SDevin Teske# f_input_group $group
44*ab2043b8SDevin Teske#
45*ab2043b8SDevin Teske# Given $group name or id, create the environment variables group_name,
46*ab2043b8SDevin Teske# group_gid, and group_members (and group_password is reset to NULL).
47*ab2043b8SDevin Teske#
48*ab2043b8SDevin Teskef_input_group()
49*ab2043b8SDevin Teske{
50*ab2043b8SDevin Teske	eval $( pw groupshow "$1" | awk -F: '
51*ab2043b8SDevin Teske	{
52*ab2043b8SDevin Teske		printf "group_name='\'%s\''\n", $1
53*ab2043b8SDevin Teske		printf "group_password=\n"
54*ab2043b8SDevin Teske		printf "group_gid='\'%s\''\n", $3
55*ab2043b8SDevin Teske		printf "group_members='\'%s\''\n", $4
56*ab2043b8SDevin Teske		exit
57*ab2043b8SDevin Teske	}' )
58*ab2043b8SDevin Teske}
59*ab2043b8SDevin Teske
60*ab2043b8SDevin Teske# f_dialog_menu_group_list
61*ab2043b8SDevin Teske#
62*ab2043b8SDevin Teske# Allows the user to select a group from a list.
63*ab2043b8SDevin Teske#
64*ab2043b8SDevin Teskef_dialog_menu_group_list()
65*ab2043b8SDevin Teske{
66*ab2043b8SDevin Teske	local menu_list size
67*ab2043b8SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
68*ab2043b8SDevin Teske
69*ab2043b8SDevin Teske	menu_list="
70*ab2043b8SDevin Teske		'X $msg_exit' ''
71*ab2043b8SDevin Teske	" # END-QUOTE
72*ab2043b8SDevin Teske
73*ab2043b8SDevin Teske	# Add groups from group(5)
74*ab2043b8SDevin Teske	menu_list="$menu_list $( pw groupshow -a | awk -F: '
75*ab2043b8SDevin Teske		!/^[[:space:]]*(#|$)/ {
76*ab2043b8SDevin Teske			printf "'\'%s\'\ \'%s\''\n", $1, $1
77*ab2043b8SDevin Teske		}'
78*ab2043b8SDevin Teske	)"
79*ab2043b8SDevin Teske
80*ab2043b8SDevin Teske	size=$( eval f_dialog_menu_size \
81*ab2043b8SDevin Teske	        	\"\$DIALOG_TITLE\"     \
82*ab2043b8SDevin Teske	        	\"\$DIALOG_BACKTITLE\" \
83*ab2043b8SDevin Teske	        	\"\"                   \
84*ab2043b8SDevin Teske	        	\"\$hline\"            \
85*ab2043b8SDevin Teske	        	$menu_list             )
86*ab2043b8SDevin Teske
87*ab2043b8SDevin Teske	eval $DIALOG \
88*ab2043b8SDevin Teske		--clear --title \"\$DIALOG_TITLE\" \
89*ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
90*ab2043b8SDevin Teske		--hline \"\$hline\"                \
91*ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
92*ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
93*ab2043b8SDevin Teske		--menu \"\" $size $menu_list       \
94*ab2043b8SDevin Teske		2> "$DIALOG_TMPDIR/dialog.menu.$$"
95*ab2043b8SDevin Teske}
96*ab2043b8SDevin Teske
97*ab2043b8SDevin Teske# f_dialog_input_group_name [$group_name]
98*ab2043b8SDevin Teske#
99*ab2043b8SDevin Teske# Allows the user to enter a new groupname for a given group. If the user does
100*ab2043b8SDevin Teske# not cancel or press ESC, the $group_name variable will hold the
101*ab2043b8SDevin Teske# newly-configured value upon return.
102*ab2043b8SDevin Teske#
103*ab2043b8SDevin Teske# If $cur_group_name is defined, the user can enter that and by-pass error-
104*ab2043b8SDevin Teske# checking (allowing the user to "revert" to an old value without, for example,
105*ab2043b8SDevin Teske# being told that the groupname already exists).
106*ab2043b8SDevin Teske#
107*ab2043b8SDevin Teskef_dialog_input_group_name()
108*ab2043b8SDevin Teske{
109*ab2043b8SDevin Teske	local msg="$( printf "$msg_group" )"
110*ab2043b8SDevin Teske	local hline="$hline_alnum_tab_enter"
111*ab2043b8SDevin Teske
112*ab2043b8SDevin Teske	#
113*ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
114*ab2043b8SDevin Teske	#
115*ab2043b8SDevin Teske	local size retval _name="$1" _input="$1"
116*ab2043b8SDevin Teske	while :; do
117*ab2043b8SDevin Teske		size=$( f_dialog_inputbox_size \
118*ab2043b8SDevin Teske		        	"$DIALOG_TITLE"     \
119*ab2043b8SDevin Teske		        	"$DIALOG_BACKTITLE" \
120*ab2043b8SDevin Teske		        	"$msg"              \
121*ab2043b8SDevin Teske		        	"$_input"           \
122*ab2043b8SDevin Teske		        	"$hline"            )
123*ab2043b8SDevin Teske
124*ab2043b8SDevin Teske		eval $DIALOG \
125*ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
126*ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
127*ab2043b8SDevin Teske			--hline \"\$hline\"                \
128*ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
129*ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
130*ab2043b8SDevin Teske			--inputbox \"\$msg\" $size         \
131*ab2043b8SDevin Teske			\"\$_input\"                       \
132*ab2043b8SDevin Teske			2> $DIALOG_TMPDIR/dialog.inputbox.$$
133*ab2043b8SDevin Teske
134*ab2043b8SDevin Teske		retval=$?
135*ab2043b8SDevin Teske		_input=$( f_dialog_inputstr )
136*ab2043b8SDevin Teske
137*ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
138*ab2043b8SDevin Teske		[ $retval -eq $SUCCESS ] || return $retval
139*ab2043b8SDevin Teske
140*ab2043b8SDevin Teske		# Check for no-change
141*ab2043b8SDevin Teske		[ "$_input" = "$_name" ] && return $SUCCESS
142*ab2043b8SDevin Teske
143*ab2043b8SDevin Teske		# Check for reversion
144*ab2043b8SDevin Teske		if [ "$_input" = "$cur_group_name" ]; then
145*ab2043b8SDevin Teske			group_name="$cur_group_name"
146*ab2043b8SDevin Teske			return $SUCCESS
147*ab2043b8SDevin Teske		fi
148*ab2043b8SDevin Teske
149*ab2043b8SDevin Teske		# Check for NULL entry
150*ab2043b8SDevin Teske		if [ ! "$_input" ]; then
151*ab2043b8SDevin Teske			f_show_msg "$msg_group_is_empty"
152*ab2043b8SDevin Teske			continue
153*ab2043b8SDevin Teske		fi
154*ab2043b8SDevin Teske
155*ab2043b8SDevin Teske		# Check for invalid entry
156*ab2043b8SDevin Teske		if ! echo "$_input" | grep -q "^[[:alpha:]]"; then
157*ab2043b8SDevin Teske			f_show_msg "$msg_group_must_start_with_letter"
158*ab2043b8SDevin Teske			continue
159*ab2043b8SDevin Teske		fi
160*ab2043b8SDevin Teske
161*ab2043b8SDevin Teske		# Check for duplicate entry
162*ab2043b8SDevin Teske		if f_quietly pw groupshow -n "$_input"; then
163*ab2043b8SDevin Teske			f_show_msg "$msg_group_already_used" "$_input"
164*ab2043b8SDevin Teske			continue
165*ab2043b8SDevin Teske		fi
166*ab2043b8SDevin Teske
167*ab2043b8SDevin Teske		group_name="$_input"
168*ab2043b8SDevin Teske		break
169*ab2043b8SDevin Teske	done
170*ab2043b8SDevin Teske	save_flag=1
171*ab2043b8SDevin Teske
172*ab2043b8SDevin Teske	f_dprintf "group_name: [$cur_group_name]->[$group_name]"
173*ab2043b8SDevin Teske
174*ab2043b8SDevin Teske	return $SUCCESS
175*ab2043b8SDevin Teske}
176*ab2043b8SDevin Teske
177*ab2043b8SDevin Teske# f_dialog_input_group_password
178*ab2043b8SDevin Teske#
179*ab2043b8SDevin Teske# Prompt the user to enter a password (twice).
180*ab2043b8SDevin Teske#
181*ab2043b8SDevin Teskef_dialog_input_group_password()
182*ab2043b8SDevin Teske{
183*ab2043b8SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
184*ab2043b8SDevin Teske	local msg size rmsg rsize
185*ab2043b8SDevin Teske
186*ab2043b8SDevin Teske	msg=$( printf "$msg_group_password" )
187*ab2043b8SDevin Teske	size=$( f_dialog_inputbox_size \
188*ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
189*ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
190*ab2043b8SDevin Teske	        	"$msg"              \
191*ab2043b8SDevin Teske	        	""                  \
192*ab2043b8SDevin Teske	        	"$hline"            )
193*ab2043b8SDevin Teske
194*ab2043b8SDevin Teske	rmsg=$( printf "$msg_reenter_group_password" )
195*ab2043b8SDevin Teske	rsize=$( f_dialog_inputbox_size \
196*ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
197*ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
198*ab2043b8SDevin Teske	        	"$rmsg"             \
199*ab2043b8SDevin Teske	        	""                  \
200*ab2043b8SDevin Teske	        	"$hline"            )
201*ab2043b8SDevin Teske
202*ab2043b8SDevin Teske	#
203*ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
204*ab2043b8SDevin Teske	#
205*ab2043b8SDevin Teske	local retval _password1 _password2
206*ab2043b8SDevin Teske	while :; do
207*ab2043b8SDevin Teske		eval $DIALOG \
208*ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
209*ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
210*ab2043b8SDevin Teske			--hline \"\$hline\"                \
211*ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
212*ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
213*ab2043b8SDevin Teske			--insecure                         \
214*ab2043b8SDevin Teske			--passwordbox \"\$msg\" $size      \
215*ab2043b8SDevin Teske			2> $DIALOG_TMPDIR/dialog.inputbox.$$
216*ab2043b8SDevin Teske
217*ab2043b8SDevin Teske		retval=$?
218*ab2043b8SDevin Teske		_password1=$( f_dialog_inputstr )
219*ab2043b8SDevin Teske
220*ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
221*ab2043b8SDevin Teske		[ $retval -eq $SUCCESS ] || return $retval
222*ab2043b8SDevin Teske
223*ab2043b8SDevin Teske		eval $DIALOG \
224*ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
225*ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
226*ab2043b8SDevin Teske			--hline \"\$hline\"                \
227*ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
228*ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
229*ab2043b8SDevin Teske			--insecure                         \
230*ab2043b8SDevin Teske			--passwordbox \"\$rmsg\" $rsize    \
231*ab2043b8SDevin Teske			2> $DIALOG_TMPDIR/dialog.inputbox.$$
232*ab2043b8SDevin Teske
233*ab2043b8SDevin Teske		retval=$?
234*ab2043b8SDevin Teske		_password2=$( f_dialog_inputstr )
235*ab2043b8SDevin Teske
236*ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
237*ab2043b8SDevin Teske		[ $retval -eq $SUCCESS ] || return $retval
238*ab2043b8SDevin Teske
239*ab2043b8SDevin Teske		# Check for password mismatch
240*ab2043b8SDevin Teske		if [ "$_password1" != "$_password2" ]; then
241*ab2043b8SDevin Teske			f_show_msg "$msg_group_passwords_do_not_match"
242*ab2043b8SDevin Teske			continue
243*ab2043b8SDevin Teske		fi
244*ab2043b8SDevin Teske
245*ab2043b8SDevin Teske		# Check for NULL entry
246*ab2043b8SDevin Teske		if [ ! "$_password1" ]; then
247*ab2043b8SDevin Teske			f_dialog_yesno \
248*ab2043b8SDevin Teske				"$msg_disable_password_auth_for_group" ||
249*ab2043b8SDevin Teske				continue
250*ab2043b8SDevin Teske			pw_group_password_disable=1
251*ab2043b8SDevin Teske		else
252*ab2043b8SDevin Teske			pw_group_password_disable=
253*ab2043b8SDevin Teske		fi
254*ab2043b8SDevin Teske
255*ab2043b8SDevin Teske		group_password="$_password1"
256*ab2043b8SDevin Teske		break
257*ab2043b8SDevin Teske	done
258*ab2043b8SDevin Teske	save_flag=1
259*ab2043b8SDevin Teske
260*ab2043b8SDevin Teske	f_dprintf "group_password: [$cur_group_password]->[$group_password]"
261*ab2043b8SDevin Teske
262*ab2043b8SDevin Teske	return $SUCCESS
263*ab2043b8SDevin Teske}
264*ab2043b8SDevin Teske
265*ab2043b8SDevin Teske# f_dialog_input_group_gid [$group_gid]
266*ab2043b8SDevin Teske#
267*ab2043b8SDevin Teske# Allow the user to enter a new GID for a given group. If the user does not
268*ab2043b8SDevin Teske# cancel or press ESC, the $group_gid variable will hold the newly-configured
269*ab2043b8SDevin Teske# value upon return.
270*ab2043b8SDevin Teske#
271*ab2043b8SDevin Teskef_dialog_input_group_gid()
272*ab2043b8SDevin Teske{
273*ab2043b8SDevin Teske	local msg size retval _input="$1"
274*ab2043b8SDevin Teske	local hline="$hline_num_tab_enter"
275*ab2043b8SDevin Teske
276*ab2043b8SDevin Teske	msg=$( printf "$msg_group_id_leave_empty_for_default" )
277*ab2043b8SDevin Teske	size=$( f_dialog_inputbox_size \
278*ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
279*ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
280*ab2043b8SDevin Teske	        	"$msg"              \
281*ab2043b8SDevin Teske	        	"$_input"           \
282*ab2043b8SDevin Teske	        	"$hline"            )
283*ab2043b8SDevin Teske
284*ab2043b8SDevin Teske	eval $DIALOG \
285*ab2043b8SDevin Teske		--title \"\$DIALOG_TITLE\"         \
286*ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
287*ab2043b8SDevin Teske		--hline \"\$hline\"                \
288*ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
289*ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
290*ab2043b8SDevin Teske		--inputbox \"\$msg\" $size         \
291*ab2043b8SDevin Teske		\"\$_input\"                       \
292*ab2043b8SDevin Teske		2> $DIALOG_TMPDIR/dialog.inputbox.$$
293*ab2043b8SDevin Teske
294*ab2043b8SDevin Teske	retval=$?
295*ab2043b8SDevin Teske	_input=$( f_dialog_inputstr )
296*ab2043b8SDevin Teske
297*ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
298*ab2043b8SDevin Teske	[ $retval -eq $SUCCESS ] || return $retval
299*ab2043b8SDevin Teske
300*ab2043b8SDevin Teske	group_gid="$_input"
301*ab2043b8SDevin Teske	save_flag=1
302*ab2043b8SDevin Teske
303*ab2043b8SDevin Teske	f_dprintf "group_gid: [$cur_group_gid]->[$group_gid]"
304*ab2043b8SDevin Teske
305*ab2043b8SDevin Teske	return $SUCCESS
306*ab2043b8SDevin Teske}
307*ab2043b8SDevin Teske
308*ab2043b8SDevin Teske# f_dialog_input_group_members [$group_members]
309*ab2043b8SDevin Teske#
310*ab2043b8SDevin Teske# Allow the user to modify a list of members for a given group. If the user does
311*ab2043b8SDevin Teske# not cancel or press ESC, the $group_members variable will hold the newly-
312*ab2043b8SDevin Teske# configured value upon return.
313*ab2043b8SDevin Teske#
314*ab2043b8SDevin Teskef_dialog_input_group_members()
315*ab2043b8SDevin Teske{
316*ab2043b8SDevin Teske	local menu_choice msg size retval _input="$1"
317*ab2043b8SDevin Teske	local hline="$hline_num_arrows_tab_enter"
318*ab2043b8SDevin Teske	local user
319*ab2043b8SDevin Teske	local menu_list
320*ab2043b8SDevin Teske	local all_users_valid
321*ab2043b8SDevin Teske	local _group_members
322*ab2043b8SDevin Teske	local checklist_users
323*ab2043b8SDevin Teske
324*ab2043b8SDevin Teske	menu_list="
325*ab2043b8SDevin Teske		'X' '$msg_continue'
326*ab2043b8SDevin Teske		'1' '$msg_select_group_members_from_list'
327*ab2043b8SDevin Teske		'2' '$msg_enter_group_members_manually'
328*ab2043b8SDevin Teske	" # END-QUOTE
329*ab2043b8SDevin Teske
330*ab2043b8SDevin Teske	while :; do
331*ab2043b8SDevin Teske		msg="$msg_group_members:"
332*ab2043b8SDevin Teske		menu_size=$( eval f_dialog_menu_size \
333*ab2043b8SDevin Teske				\"\$DIALOG_TITLE\"     \
334*ab2043b8SDevin Teske				\"\$DIALOG_BACKTITLE\" \
335*ab2043b8SDevin Teske				\"\$msg\"              \
336*ab2043b8SDevin Teske				\"\$hline\"            \
337*ab2043b8SDevin Teske				$menu_list             )
338*ab2043b8SDevin Teske		eval $DIALOG \
339*ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
340*ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
341*ab2043b8SDevin Teske			--hline \"\$hline\"                \
342*ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
343*ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
344*ab2043b8SDevin Teske			--menu \"\$msg\" $menu_size        \
345*ab2043b8SDevin Teske			$menu_list                         \
346*ab2043b8SDevin Teske			2> $DIALOG_TMPDIR/dialog.menu.$$
347*ab2043b8SDevin Teske		retval=$?
348*ab2043b8SDevin Teske		menu_choice=$( f_dialog_menutag )
349*ab2043b8SDevin Teske		f_dprintf "retval=$retval menu_choice=[$menu_choice]"
350*ab2043b8SDevin Teske
351*ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
352*ab2043b8SDevin Teske		[ $retval -eq $SUCCESS ] || return $retval
353*ab2043b8SDevin Teske
354*ab2043b8SDevin Teske		case "$menu_choice" in
355*ab2043b8SDevin Teske		X) # Exit
356*ab2043b8SDevin Teske			break ;;
357*ab2043b8SDevin Teske		1) # Select Group Members from a list
358*ab2043b8SDevin Teske			user_list=$( pw usershow -a | awk -F: '
359*ab2043b8SDevin Teske				!/^[[:space:]]*(#|$)/ { printf "%s\n", $1 }' )
360*ab2043b8SDevin Teske			checklist_users=
361*ab2043b8SDevin Teske			for user in $user_list; do
362*ab2043b8SDevin Teske				checklist_users="$checklist_users $user \"\""
363*ab2043b8SDevin Teske				if echo "$_input" | grep -q "\<$user\>"; then
364*ab2043b8SDevin Teske					checklist_users="$checklist_users on"
365*ab2043b8SDevin Teske				else
366*ab2043b8SDevin Teske					checklist_users="$checklist_users off"
367*ab2043b8SDevin Teske				fi
368*ab2043b8SDevin Teske			done
369*ab2043b8SDevin Teske
370*ab2043b8SDevin Teske			size=$( eval f_dialog_radiolist_size \
371*ab2043b8SDevin Teske			        	\"\$DIALOG_TITLE\"     \
372*ab2043b8SDevin Teske			        	\"\$DIALOG_BACKTITLE\" \
373*ab2043b8SDevin Teske			        	\"\"                   \
374*ab2043b8SDevin Teske			        	\"\$hline\"            \
375*ab2043b8SDevin Teske			        	$checklist_users       )
376*ab2043b8SDevin Teske			eval $DIALOG \
377*ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"         \
378*ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
379*ab2043b8SDevin Teske				--separate-output                  \
380*ab2043b8SDevin Teske				--hline \"\$hline\"                \
381*ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"            \
382*ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"    \
383*ab2043b8SDevin Teske				--checklist \"\$msg\" $size        \
384*ab2043b8SDevin Teske				$checklist_users                   \
385*ab2043b8SDevin Teske				2> $DIALOG_TMPDIR/dialog.inputbox.$$
386*ab2043b8SDevin Teske			retval=$?
387*ab2043b8SDevin Teske			_group_members=$( f_dialog_inputstr | tr '\n' ' ' |
388*ab2043b8SDevin Teske				sed -e 's/[[:space:]]\{1,\}/,/g;s/^,//;s/,$//' )
389*ab2043b8SDevin Teske
390*ab2043b8SDevin Teske			# Return to previous menu if user has either
391*ab2043b8SDevin Teske			#     pressed ESC or chosen Cancel/No
392*ab2043b8SDevin Teske			[ $retval -eq $SUCCESS ] || continue
393*ab2043b8SDevin Teske
394*ab2043b8SDevin Teske			_input="$_group_members"
395*ab2043b8SDevin Teske			;;
396*ab2043b8SDevin Teske		2) # Enter Group Members manually
397*ab2043b8SDevin Teske			hline="$hline_num_tab_enter"
398*ab2043b8SDevin Teske			msg=$(
399*ab2043b8SDevin Teske			  printf "$msg_group_members ($msg_separated_by_commas)"
400*ab2043b8SDevin Teske			)
401*ab2043b8SDevin Teske			size=$( f_dialog_inputbox_size \
402*ab2043b8SDevin Teske	        		"$DIALOG_TITLE"     \
403*ab2043b8SDevin Teske	        		"$DIALOG_BACKTITLE" \
404*ab2043b8SDevin Teske	        		"$msg"              \
405*ab2043b8SDevin Teske	        		"$_input"           \
406*ab2043b8SDevin Teske	        		"$hline"            )
407*ab2043b8SDevin Teske
408*ab2043b8SDevin Teske			eval $DIALOG \
409*ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"         \
410*ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
411*ab2043b8SDevin Teske				--hline \"\$hline\"                \
412*ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"            \
413*ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"    \
414*ab2043b8SDevin Teske				--inputbox \"\$msg\" $size         \
415*ab2043b8SDevin Teske				\"\$_input\"                       \
416*ab2043b8SDevin Teske				2> $DIALOG_TMPDIR/dialog.inputbox.$$
417*ab2043b8SDevin Teske
418*ab2043b8SDevin Teske			retval=$?
419*ab2043b8SDevin Teske			_group_members=$( f_dialog_inputstr )
420*ab2043b8SDevin Teske
421*ab2043b8SDevin Teske			# Return to previous menu if user has either
422*ab2043b8SDevin Teske			#     pressed ESC or chosen Cancel/No
423*ab2043b8SDevin Teske			[ $retval -eq $SUCCESS ] || continue
424*ab2043b8SDevin Teske
425*ab2043b8SDevin Teske			_input="$_group_members"
426*ab2043b8SDevin Teske			;;
427*ab2043b8SDevin Teske		esac
428*ab2043b8SDevin Teske	done
429*ab2043b8SDevin Teske
430*ab2043b8SDevin Teske	group_members="$_input"
431*ab2043b8SDevin Teske	save_flag=1
432*ab2043b8SDevin Teske	f_dprintf "group_members: [$cur_group_members]->[$group_members]"
433*ab2043b8SDevin Teske
434*ab2043b8SDevin Teske	return $SUCCESS
435*ab2043b8SDevin Teske}
436*ab2043b8SDevin Teske
437*ab2043b8SDevin Teskefi # ! $_USERMGMT_GROUP_INPUT_SUBR
438