xref: /freebsd/usr.sbin/bsdconfig/usermgmt/share/group_input.subr (revision f677a9e2672665f4eb3dd4111c07ee8f1f954262)
1ab2043b8SDevin Teskeif [ ! "$_USERMGMT_GROUP_INPUT_SUBR" ]; then _USERMGMT_GROUP_INPUT_SUBR=1
2ab2043b8SDevin Teske#
3ab2043b8SDevin Teske# Copyright (c) 2012 Ron McDowell
4d3a0f918SDevin Teske# Copyright (c) 2012-2013 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{
51ab2043b8SDevin Teske	eval $( pw groupshow "$1" | awk -F: '
52ab2043b8SDevin Teske	{
53ab2043b8SDevin Teske		printf "group_name='\'%s\''\n", $1
54ab2043b8SDevin Teske		printf "group_password=\n"
55ab2043b8SDevin Teske		printf "group_gid='\'%s\''\n", $3
56ab2043b8SDevin Teske		printf "group_members='\'%s\''\n", $4
57ab2043b8SDevin Teske		exit
58ab2043b8SDevin Teske	}' )
59ab2043b8SDevin Teske}
60ab2043b8SDevin Teske
61d3a0f918SDevin Teske# f_dialog_menu_group_list [$default]
62ab2043b8SDevin Teske#
63d3a0f918SDevin Teske# Allows the user to select a group from a list. Optionally, if present and
64d3a0f918SDevin Teske# non-NULL, initially highlight $default group.
65ab2043b8SDevin Teske#
66ab2043b8SDevin Teskef_dialog_menu_group_list()
67ab2043b8SDevin Teske{
68052f8969SDevin Teske	local prompt=
69052f8969SDevin Teske	local menu_list="
70ab2043b8SDevin Teske		'X $msg_exit' ''
71ab2043b8SDevin Teske	" # END-QUOTE
72052f8969SDevin Teske	local defaultitem="$1"
73052f8969SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
74ab2043b8SDevin Teske
75ab2043b8SDevin Teske	# Add groups from group(5)
76ab2043b8SDevin Teske	menu_list="$menu_list $( pw groupshow -a | awk -F: '
77ab2043b8SDevin Teske		!/^[[:space:]]*(#|$)/ {
78ab2043b8SDevin Teske			printf "'\'%s\'\ \'%s\''\n", $1, $1
79ab2043b8SDevin Teske		}'
80ab2043b8SDevin Teske	)"
81ab2043b8SDevin Teske
8274036c4dSDevin Teske	local height width rows
8374036c4dSDevin Teske	eval f_dialog_menu_size height width rows \
84ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
85ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
86052f8969SDevin Teske	                        \"\$prompt\"           \
87ab2043b8SDevin Teske	                        \"\$hline\"            \
8874036c4dSDevin Teske	                        $menu_list
89ab2043b8SDevin Teske
90fd962ac6SDevin Teske	local menu_choice
91fd962ac6SDevin Teske	menu_choice=$( eval $DIALOG \
92d3a0f918SDevin Teske		--title \"\$DIALOG_TITLE\"         \
93ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
94ab2043b8SDevin Teske		--hline \"\$hline\"                \
95ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
96ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
97d3a0f918SDevin Teske		--default-item \"\$defaultitem\"   \
98052f8969SDevin Teske		--menu \"\$prompt\"                \
9974036c4dSDevin Teske		$height $width $rows               \
10074036c4dSDevin Teske		$menu_list                         \
10189498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
10289498fdfSDevin Teske	)
10389498fdfSDevin Teske	local retval=$?
104fd962ac6SDevin Teske	f_dialog_menutag_store -s "$menu_choice"
10589498fdfSDevin Teske	return $retval
106ab2043b8SDevin Teske}
107ab2043b8SDevin Teske
108ab2043b8SDevin Teske# f_dialog_input_group_name [$group_name]
109ab2043b8SDevin Teske#
110ab2043b8SDevin Teske# Allows the user to enter a new groupname for a given group. If the user does
111ab2043b8SDevin Teske# not cancel or press ESC, the $group_name variable will hold the
112ab2043b8SDevin Teske# newly-configured value upon return.
113ab2043b8SDevin Teske#
114ab2043b8SDevin Teske# If $cur_group_name is defined, the user can enter that and by-pass error-
115ab2043b8SDevin Teske# checking (allowing the user to "revert" to an old value without, for example,
116ab2043b8SDevin Teske# being told that the groupname already exists).
117ab2043b8SDevin Teske#
118ab2043b8SDevin Teskef_dialog_input_group_name()
119ab2043b8SDevin Teske{
120ab2043b8SDevin Teske	#
121ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
122ab2043b8SDevin Teske	#
123298cf604SDevin Teske	local _name="$1" _input="$1"
124ab2043b8SDevin Teske	while :; do
125ab2043b8SDevin Teske
126ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
127ec7120b5SDevin Teske		f_dialog_input _input "$msg_group" "$_input" \
128*f677a9e2SDevin Teske		               "$hline_alnum_tab_enter" || return $?
129ab2043b8SDevin Teske
130ab2043b8SDevin Teske		# Check for no-change
131*f677a9e2SDevin Teske		[ "$_input" = "$_name" ] && return $DIALOG_OK
132ab2043b8SDevin Teske
133ab2043b8SDevin Teske		# Check for reversion
134ab2043b8SDevin Teske		if [ "$_input" = "$cur_group_name" ]; then
135ab2043b8SDevin Teske			group_name="$cur_group_name"
136*f677a9e2SDevin Teske			return $DIALOG_OK
137ab2043b8SDevin Teske		fi
138ab2043b8SDevin Teske
139ab2043b8SDevin Teske		# Check for NULL entry
140ab2043b8SDevin Teske		if [ ! "$_input" ]; then
1417079fc4eSDevin Teske			f_show_msg "$msg_group_is_empty"
142ab2043b8SDevin Teske			continue
143ab2043b8SDevin Teske		fi
144ab2043b8SDevin Teske
145ab2043b8SDevin Teske		# Check for invalid entry
146ab2043b8SDevin Teske		if ! echo "$_input" | grep -q "^[[:alpha:]]"; then
1477079fc4eSDevin Teske			f_show_msg "$msg_group_must_start_with_letter"
148ab2043b8SDevin Teske			continue
149ab2043b8SDevin Teske		fi
150ab2043b8SDevin Teske
151ab2043b8SDevin Teske		# Check for duplicate entry
152ab2043b8SDevin Teske		if f_quietly pw groupshow -n "$_input"; then
153ab2043b8SDevin Teske			f_show_msg "$msg_group_already_used" "$_input"
154ab2043b8SDevin Teske			continue
155ab2043b8SDevin Teske		fi
156ab2043b8SDevin Teske
157ab2043b8SDevin Teske		group_name="$_input"
158ab2043b8SDevin Teske		break
159ab2043b8SDevin Teske	done
160ab2043b8SDevin Teske	save_flag=1
161ab2043b8SDevin Teske
162526e1dc1SDevin Teske	f_dprintf "group_name: [%s]->[%s]" "$cur_group_name" "$group_name"
163ab2043b8SDevin Teske
164*f677a9e2SDevin Teske	return $DIALOG_OK
165ab2043b8SDevin Teske}
166ab2043b8SDevin Teske
167ab2043b8SDevin Teske# f_dialog_input_group_password
168ab2043b8SDevin Teske#
169ab2043b8SDevin Teske# Prompt the user to enter a password (twice).
170ab2043b8SDevin Teske#
171ab2043b8SDevin Teskef_dialog_input_group_password()
172ab2043b8SDevin Teske{
173052f8969SDevin Teske	local prompt1="$msg_group_password"
174052f8969SDevin Teske	local prompt2="$msg_reenter_group_password"
175ab2043b8SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
176ab2043b8SDevin Teske
17774036c4dSDevin Teske	local height1 width1
17874036c4dSDevin Teske	f_dialog_inputbox_size height1 width1 \
179ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
180ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
181052f8969SDevin Teske	        	"$prompt1"          \
182ab2043b8SDevin Teske	        	""                  \
18374036c4dSDevin Teske	        	"$hline"
184ab2043b8SDevin Teske
18574036c4dSDevin Teske	local height2 width2
18674036c4dSDevin Teske	f_dialog_inputbox_size height2 width2 \
187ab2043b8SDevin Teske	        	"$DIALOG_TITLE"     \
188ab2043b8SDevin Teske	        	"$DIALOG_BACKTITLE" \
189052f8969SDevin Teske	        	"$prompt2"          \
190ab2043b8SDevin Teske	        	""                  \
19174036c4dSDevin Teske	        	"$hline"
192ab2043b8SDevin Teske
193ab2043b8SDevin Teske	#
194ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
195ab2043b8SDevin Teske	#
196ab2043b8SDevin Teske	local retval _password1 _password2
197ab2043b8SDevin Teske	while :; do
198ec7120b5SDevin Teske		_password1=$( $DIALOG \
19974036c4dSDevin Teske			--title "$DIALOG_TITLE"         \
20074036c4dSDevin Teske			--backtitle "$DIALOG_BACKTITLE" \
20174036c4dSDevin Teske			--hline "$hline"                \
20274036c4dSDevin Teske			--ok-label "$msg_ok"            \
20374036c4dSDevin Teske			--cancel-label "$msg_cancel"    \
204ab2043b8SDevin Teske			--insecure                      \
205052f8969SDevin Teske			--passwordbox "$prompt1"        \
20674036c4dSDevin Teske			$height1 $width1                \
20789498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
20889498fdfSDevin Teske		)
209ab2043b8SDevin Teske		retval=$?
210ec7120b5SDevin Teske		debug= f_dialog_line_sanitize _password1
211ab2043b8SDevin Teske
212ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
213*f677a9e2SDevin Teske		[ $retval -eq $DIALOG_OK ] || return $retval
214ab2043b8SDevin Teske
215ec7120b5SDevin Teske		_password2=$( $DIALOG \
21674036c4dSDevin Teske			--title "$DIALOG_TITLE"         \
21774036c4dSDevin Teske			--backtitle "$DIALOG_BACKTITLE" \
21874036c4dSDevin Teske			--hline "$hline"                \
21974036c4dSDevin Teske			--ok-label "$msg_ok"            \
22074036c4dSDevin Teske			--cancel-label "$msg_cancel"    \
221ab2043b8SDevin Teske			--insecure                      \
222052f8969SDevin Teske			--passwordbox "$prompt2"        \
22374036c4dSDevin Teske			$height2 $width2                \
22489498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
22589498fdfSDevin Teske		)
226ab2043b8SDevin Teske		retval=$?
227ec7120b5SDevin Teske		debug= f_dialog_line_sanitize _password2
228ab2043b8SDevin Teske
229ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
230*f677a9e2SDevin Teske		[ $retval -eq $DIALOG_OK ] || return $retval
231ab2043b8SDevin Teske
232ab2043b8SDevin Teske		# Check for password mismatch
233ab2043b8SDevin Teske		if [ "$_password1" != "$_password2" ]; then
2347079fc4eSDevin Teske			f_show_msg "$msg_group_passwords_do_not_match"
235ab2043b8SDevin Teske			continue
236ab2043b8SDevin Teske		fi
237ab2043b8SDevin Teske
238ab2043b8SDevin Teske		# Check for NULL entry
239ab2043b8SDevin Teske		if [ ! "$_password1" ]; then
2407ca5c4cbSDevin Teske			f_dialog_yesno "$msg_disable_password_auth_for_group"
2417ca5c4cbSDevin Teske			local retval=$?
242*f677a9e2SDevin Teske			if [ $retval -eq $DIALOG_ESC ]; then
243528318aeSDevin Teske				return $retval
244*f677a9e2SDevin Teske			elif [ $retval -eq $DIALOG_OK ]; then
245528318aeSDevin Teske				pw_group_password_disable=1
246528318aeSDevin Teske			else
247350db065SDevin Teske				continue # back to password prompt
248528318aeSDevin Teske			fi
249ab2043b8SDevin Teske		else
250ab2043b8SDevin Teske			pw_group_password_disable=
251ab2043b8SDevin Teske		fi
252ab2043b8SDevin Teske
253ab2043b8SDevin Teske		group_password="$_password1"
254ab2043b8SDevin Teske		break
255ab2043b8SDevin Teske	done
256ab2043b8SDevin Teske	save_flag=1
257ab2043b8SDevin Teske
258526e1dc1SDevin Teske	f_dprintf "group_password: [%s]->[%s]" \
259526e1dc1SDevin Teske	          "$cur_group_password" "$group_password"
260ab2043b8SDevin Teske
261*f677a9e2SDevin Teske	return $DIALOG_OK
262ab2043b8SDevin Teske}
263ab2043b8SDevin Teske
264ab2043b8SDevin Teske# f_dialog_input_group_gid [$group_gid]
265ab2043b8SDevin Teske#
266ab2043b8SDevin Teske# Allow the user to enter a new GID for a given group. If the user does not
267ab2043b8SDevin Teske# cancel or press ESC, the $group_gid variable will hold the newly-configured
268ab2043b8SDevin Teske# value upon return.
269ab2043b8SDevin Teske#
270ab2043b8SDevin Teskef_dialog_input_group_gid()
271ab2043b8SDevin Teske{
272298cf604SDevin Teske	local _input="$1"
273ab2043b8SDevin Teske
274ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
275ec7120b5SDevin Teske	f_dialog_input _input "$msg_group_id_leave_empty_for_default" \
276*f677a9e2SDevin Teske	               "$_input" "$hline_num_tab_enter" || return $?
277ab2043b8SDevin Teske
278ab2043b8SDevin Teske	group_gid="$_input"
279ab2043b8SDevin Teske	save_flag=1
280ab2043b8SDevin Teske
281526e1dc1SDevin Teske	f_dprintf "group_gid: [%s]->[%s]" "$cur_group_gid" "$group_gid"
282ab2043b8SDevin Teske
283*f677a9e2SDevin Teske	return $DIALOG_OK
284ab2043b8SDevin Teske}
285ab2043b8SDevin Teske
286ab2043b8SDevin Teske# f_dialog_input_group_members [$group_members]
287ab2043b8SDevin Teske#
288f4844f65SDevin Teske# Allow the user to modify a list of members for a given group. If the user
289f4844f65SDevin Teske# does not cancel or press ESC, the $group_members variable will hold the
290f4844f65SDevin Teske# newly-configured value upon return.
291ab2043b8SDevin Teske#
292ab2043b8SDevin Teskef_dialog_input_group_members()
293ab2043b8SDevin Teske{
294052f8969SDevin Teske	local _input="$1"
295052f8969SDevin Teske	local prompt="$msg_group_members:"
296052f8969SDevin Teske	local menu_list="
297ab2043b8SDevin Teske		'X' '$msg_continue'
298ab2043b8SDevin Teske		'1' '$msg_select_group_members_from_list'
299ab2043b8SDevin Teske		'2' '$msg_enter_group_members_manually'
300ab2043b8SDevin Teske	" # END-QUOTE
301052f8969SDevin Teske	local defaultitem=
302052f8969SDevin Teske	local hline="$hline_num_arrows_tab_enter"
303ab2043b8SDevin Teske
30474036c4dSDevin Teske	local mheight mwidth mrows
30574036c4dSDevin Teske	eval f_dialog_menu_size mheight mwidth mrows \
306ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
307ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
308052f8969SDevin Teske	                        \"\$prompt\"           \
309ab2043b8SDevin Teske	                        \"\$hline\"            \
31074036c4dSDevin Teske	                        $menu_list
31174036c4dSDevin Teske
312052f8969SDevin Teske	local menu_choice retval
31374036c4dSDevin Teske	while :; do
314fd962ac6SDevin Teske		menu_choice=$( eval $DIALOG \
315ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
316ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
317ab2043b8SDevin Teske			--hline \"\$hline\"                \
318ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
319ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
320d3a0f918SDevin Teske			--default-item \"\$defaultitem\"   \
321052f8969SDevin Teske			--menu \"\$prompt\"                \
32274036c4dSDevin Teske			$mheight $mwidth $mrows            \
323ab2043b8SDevin Teske			$menu_list                         \
32489498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
32589498fdfSDevin Teske		)
326ab2043b8SDevin Teske		retval=$?
327fd962ac6SDevin Teske		f_dialog_data_sanitize menu_choice
328fd962ac6SDevin Teske		defaultitem="$menu_choice"
329526e1dc1SDevin Teske		f_dprintf "retval=%u menu_choice=[%s]" $retval "$menu_choice"
330ab2043b8SDevin Teske
331ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
332*f677a9e2SDevin Teske		[ $retval -eq $DIALOG_OK ] || return $retval
333ab2043b8SDevin Teske
334052f8969SDevin Teske		local _group_members
335ab2043b8SDevin Teske		case "$menu_choice" in
336ab2043b8SDevin Teske		X) # Exit
337ab2043b8SDevin Teske			break ;;
338ab2043b8SDevin Teske		1) # Select Group Members from a list
339052f8969SDevin Teske			local user check_list=
340052f8969SDevin Teske			for user in $( pw usershow -a |
341052f8969SDevin Teske				awk -F: '!/^[[:space:]]*(#|$)/{print $1}'
342052f8969SDevin Teske			); do
343052f8969SDevin Teske				# Format of a checklist entry: tag item status
344ab2043b8SDevin Teske				if echo "$_input" | grep -q "\<$user\>"; then
345052f8969SDevin Teske					check_list="$check_list $user '' on"
346ab2043b8SDevin Teske				else
347052f8969SDevin Teske					check_list="$check_list $user '' off"
348ab2043b8SDevin Teske				fi
349ab2043b8SDevin Teske			done
350ab2043b8SDevin Teske
35174036c4dSDevin Teske			local cheight cwidth crows
35274036c4dSDevin Teske			eval f_dialog_checklist_size cheight cwidth crows \
353ab2043b8SDevin Teske			                             \"\$DIALOG_TITLE\"     \
354ab2043b8SDevin Teske			                             \"\$DIALOG_BACKTITLE\" \
355052f8969SDevin Teske			                             \"\$prompt\"           \
356ab2043b8SDevin Teske			                             \"\$hline\"            \
357052f8969SDevin Teske			                             $check_list
358fd962ac6SDevin Teske			_group_members=$( eval $DIALOG \
359ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"         \
360ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
361ab2043b8SDevin Teske				--separate-output                  \
362ab2043b8SDevin Teske				--hline \"\$hline\"                \
363ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"            \
364ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"    \
365052f8969SDevin Teske				--checklist \"\$prompt\"           \
36674036c4dSDevin Teske				$cheight $cwidth $crows            \
367052f8969SDevin Teske				$check_list                        \
36889498fdfSDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
369fd962ac6SDevin Teske			) || continue
370fd962ac6SDevin Teske				# Return to previous menu if user either
371fd962ac6SDevin Teske				# pressed ESC or chose Cancel/No
372fd962ac6SDevin Teske			f_dialog_data_sanitize _group_members
373ab2043b8SDevin Teske
374fd962ac6SDevin Teske			# Convert the newline separated list into a comma-
375fd962ac6SDevin Teske			# separated one so that if the user switches over to
376fd962ac6SDevin Teske			# manual editing, list reflects checklist selections
377fd962ac6SDevin Teske			_group_members=$( echo "$_group_members" |
378fd962ac6SDevin Teske				tr '\n' ' ' |
379fd962ac6SDevin Teske				sed -e 's/[[:space:]]\{1,\}/,/g;s/^,//;s/,$//'
380fd962ac6SDevin Teske			)
381ab2043b8SDevin Teske
382ab2043b8SDevin Teske			_input="$_group_members"
383ab2043b8SDevin Teske			;;
384ab2043b8SDevin Teske		2) # Enter Group Members manually
385052f8969SDevin Teske			local p="$msg_group_members ($msg_separated_by_commas)"
386ab2043b8SDevin Teske
387052f8969SDevin Teske			f_dialog_input _group_members "$p" "$_input" \
388ec7120b5SDevin Teske			               "$hline_num_tab_enter" || continue
389ec7120b5SDevin Teske				# Return to previous menu if user either
390ec7120b5SDevin Teske				# pressed ESC or chose Cancel/No
391ab2043b8SDevin Teske
392ab2043b8SDevin Teske			_input="$_group_members"
393ab2043b8SDevin Teske			;;
394ab2043b8SDevin Teske		esac
395ab2043b8SDevin Teske	done
396ab2043b8SDevin Teske
397ab2043b8SDevin Teske	group_members="$_input"
398ab2043b8SDevin Teske	save_flag=1
399526e1dc1SDevin Teske	f_dprintf "group_members: [%s]->[%s]" \
400526e1dc1SDevin Teske	          "$cur_group_members" "$group_members"
401ab2043b8SDevin Teske
402*f677a9e2SDevin Teske	return $DIALOG_OK
403ab2043b8SDevin Teske}
404ab2043b8SDevin Teske
40556961fd7SDevin Teske############################################################ MAIN
40656961fd7SDevin Teske
40756961fd7SDevin Teskef_dprintf "%s: Successfully loaded." usermgmt/group_input.subr
40856961fd7SDevin Teske
409ab2043b8SDevin Teskefi # ! $_USERMGMT_GROUP_INPUT_SUBR
410