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