xref: /freebsd/usr.sbin/bsdconfig/usermgmt/share/user_input.subr (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1ab2043b8SDevin Teskeif [ ! "$_USERMGMT_USER_INPUT_SUBR" ]; then _USERMGMT_USER_INPUT_SUBR=1
2ab2043b8SDevin Teske#
3ab2043b8SDevin Teske# Copyright (c) 2012 Ron McDowell
4f589320aSDevin 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#
29ab2043b8SDevin Teske############################################################ INCLUDES
30ab2043b8SDevin Teske
31ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig"
32ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1
3356961fd7SDevin Teskef_dprintf "%s: loading includes..." usermgmt/user_input.subr
34ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr
35ab2043b8SDevin Teskef_include $BSDCFG_SHARE/strings.subr
36ab2043b8SDevin Teske
37ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="070.usermgmt"
38ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/include/messages.subr
39ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40ab2043b8SDevin Teske
41ab2043b8SDevin Teske############################################################ CONFIGURATION
42ab2043b8SDevin Teske
43ab2043b8SDevin Teske#
44ab2043b8SDevin Teske# Default location of shells(5)
45ab2043b8SDevin Teske#
46ab2043b8SDevin Teske: ${ETC_SHELLS:=/etc/shells}
47ab2043b8SDevin Teske
48ab2043b8SDevin Teske############################################################ FUNCTIONS
49ab2043b8SDevin Teske
50f589320aSDevin Teske# f_get_member_groups $var_to_set $user
51ab2043b8SDevin Teske#
52ab2043b8SDevin Teske# Get a list of additional groups $user is a member of in group(5).
53ab2043b8SDevin Teske#
54ab2043b8SDevin Teskef_get_member_groups()
55ab2043b8SDevin Teske{
56f589320aSDevin Teske	f_replaceall "$( pw groupshow -a | awk -F: -v user="$2" '{
57f589320aSDevin Teske		if (!split($4, users, /,/)) next
58f589320aSDevin Teske		for (u in users) if (users[u] == user) { print $1; next }
59f589320aSDevin Teske	}' )" "[$NL]" "," "$1"
60ab2043b8SDevin Teske}
61ab2043b8SDevin Teske
62ab2043b8SDevin Teske# f_input_user $user
63ab2043b8SDevin Teske#
64f589320aSDevin Teske# Given $user name or id, create the environment variables user_name, user_uid,
65f589320aSDevin Teske# user_gid, user_class, user_password_expire, user_account_expire, user_gecos,
66f589320aSDevin Teske# user_home_dir, user_shell, and user_member_groups (and user_password is reset
67f589320aSDevin Teske# to NULL).
68ab2043b8SDevin Teske#
69ab2043b8SDevin Teskef_input_user()
70ab2043b8SDevin Teske{
71f589320aSDevin Teske	local funcname=f_input_user
72ab2043b8SDevin Teske	local user="$1"
73f589320aSDevin Teske
74f589320aSDevin Teske	f_dprintf "$funcname: Getting info for user \`%s'" "$user"
75f589320aSDevin Teske	eval "$( pw usershow "$user" 2> /dev/null | awk -F: '
76f589320aSDevin Teske	function set_value(var, value) {
77f589320aSDevin Teske		gsub(/'\''/, "'\''\\'\'\''", value)
78f589320aSDevin Teske		printf "user_%s='\'%s\''\n", var, value
79f589320aSDevin Teske	}
80ab2043b8SDevin Teske	{
81f589320aSDevin Teske		found = $1 != ""
82f589320aSDevin Teske		set_value("name",            $1 )
83f589320aSDevin Teske		set_value("password",        "" )
84f589320aSDevin Teske		set_value("uid",             $3 )
85f589320aSDevin Teske		set_value("gid",             $4 )
86f589320aSDevin Teske		set_value("class",           $5 )
87f589320aSDevin Teske		set_value("password_expire", $6 )
88f589320aSDevin Teske		set_value("account_expire",  $7 )
89f589320aSDevin Teske		set_value("gecos",           $8 )
90f589320aSDevin Teske		set_value("home_dir",        $9 )
91f589320aSDevin Teske		set_value("shell",           $10)
92f589320aSDevin Teske		exit
93f589320aSDevin Teske	}
94f589320aSDevin Teske	END { if (!found) print "false" }' )"
95f589320aSDevin Teske	local retval=$?
96f589320aSDevin Teske
97f589320aSDevin Teske	f_dprintf "$funcname: Getting group memberships for user \`%s'" "$user"
98f589320aSDevin Teske	f_get_member_groups user_member_groups "$user"
99f589320aSDevin Teske
100f589320aSDevin Teske	return $retval
101ab2043b8SDevin Teske}
102ab2043b8SDevin Teske
103d3a0f918SDevin Teske# f_dialog_menu_user_list [$default]
104ab2043b8SDevin Teske#
105d3a0f918SDevin Teske# Allows the user to select a login from a list. Optionally, if present and
106d3a0f918SDevin Teske# non-NULL, initially highlight $default user.
107ab2043b8SDevin Teske#
108ab2043b8SDevin Teskef_dialog_menu_user_list()
109ab2043b8SDevin Teske{
110052f8969SDevin Teske	local prompt=
111052f8969SDevin Teske	local menu_list="
112ab2043b8SDevin Teske		'X $msg_exit' ''
113ab2043b8SDevin Teske	" # END-QUOTE
114052f8969SDevin Teske	local defaultitem="$1"
115052f8969SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
116ab2043b8SDevin Teske
117ab2043b8SDevin Teske	# Add users from passwd(5)
118ab2043b8SDevin Teske	menu_list="$menu_list $( pw usershow -a | awk -F: '
119f589320aSDevin Teske		function mprint(tag, item) {
120f589320aSDevin Teske			gsub(/'\''/, "'\''\\'\'\''", tag)
121f589320aSDevin Teske			gsub(/'\''/, "'\''\\'\'\''", item)
122f589320aSDevin Teske			printf "'\'%s\'\ \'%s\''\n", tag, item
123f589320aSDevin Teske		}
124f589320aSDevin Teske		!/^[[:space:]]*(#|$)/ { mprint($1, $8) }
125f589320aSDevin Teske	' )"
126ab2043b8SDevin Teske
12774036c4dSDevin Teske	local height width rows
12874036c4dSDevin Teske	eval f_dialog_menu_size height width rows \
129ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
130ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
131052f8969SDevin Teske	                        \"\$prompt\"           \
132ab2043b8SDevin Teske	                        \"\$hline\"            \
13374036c4dSDevin Teske	                        $menu_list
134ab2043b8SDevin Teske
135fd962ac6SDevin Teske	local menu_choice
136fd962ac6SDevin Teske	menu_choice=$( eval $DIALOG \
137d3a0f918SDevin Teske		--title \"\$DIALOG_TITLE\"         \
138ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
139ab2043b8SDevin Teske		--hline \"\$hline\"                \
140ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
141ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
142d3a0f918SDevin Teske		--default-item \"\$defaultitem\"   \
143052f8969SDevin Teske		--menu \"\$prompt\"                \
14474036c4dSDevin Teske		$height $width $rows               \
14574036c4dSDevin Teske		$menu_list                         \
14689498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
14789498fdfSDevin Teske	)
14889498fdfSDevin Teske	local retval=$?
149fd962ac6SDevin Teske	f_dialog_menutag_store -s "$menu_choice"
15089498fdfSDevin Teske	return $retval
151ab2043b8SDevin Teske}
152ab2043b8SDevin Teske
153f589320aSDevin Teske# f_dialog_input_member_groups $var_to_set [$member_groups]
154ab2043b8SDevin Teske#
155ab2043b8SDevin Teske# Allows the user to edit group memberships for a given user. If the user does
156f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly-
157ab2043b8SDevin Teske# configured value upon return.
158ab2043b8SDevin Teske#
159ab2043b8SDevin Teskef_dialog_input_member_groups()
160ab2043b8SDevin Teske{
161f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
162f589320aSDevin Teske	local __prompt="$msg_member_of_groups"
163f589320aSDevin Teske	local __menu_list="
164f589320aSDevin Teske		'X' '$msg_continue'
165f589320aSDevin Teske		'1' '$msg_select_groups_from_list'
166f589320aSDevin Teske		'2' '$msg_enter_groups_manually'
167f589320aSDevin Teske	" # END-QUOTE
168f589320aSDevin Teske	local __defaultitem=
169f589320aSDevin Teske	local __hline="$hline_alnum_space_tab_enter"
170052f8969SDevin Teske
171f589320aSDevin Teske	local __mheight __mwidth __mrows
172f589320aSDevin Teske	eval f_dialog_menu_size __mheight __mwidth __mrows \
173ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
174ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
175f589320aSDevin Teske	                        \"\$__prompt\"         \
176f589320aSDevin Teske	                        \"\$__hline\"          \
177f589320aSDevin Teske	                        $__menu_list
178f589320aSDevin Teske
179f589320aSDevin Teske	local __menu_choice __retval
180f589320aSDevin Teske	while :; do
181f589320aSDevin Teske		__menu_choice=$( eval $DIALOG \
182f589320aSDevin Teske			--title \"\$DIALOG_TITLE\"         \
183f589320aSDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
184f589320aSDevin Teske			--hline \"\$__hline\"              \
185f589320aSDevin Teske			--ok-label \"\$msg_ok\"            \
186f589320aSDevin Teske			--cancel-label \"\$msg_cancel\"    \
187f589320aSDevin Teske			--default-item \"\$__defaultitem\" \
188f589320aSDevin Teske			--menu \"\$__prompt\"              \
189f589320aSDevin Teske			$__mheight $__mwidth $__mrows      \
190f589320aSDevin Teske			$__menu_list                       \
191f589320aSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
192f589320aSDevin Teske		)
193f589320aSDevin Teske		__retval=$?
194f589320aSDevin Teske		f_dialog_data_sanitize __menu_choice
195f589320aSDevin Teske		__defaultitem="$__menu_choice"
196f589320aSDevin Teske		f_dprintf "retval=%u menu_choice=[%s]" \
197f589320aSDevin Teske		          $__retval "$__menu_choice"
198f589320aSDevin Teske
199f589320aSDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
200f589320aSDevin Teske		[ $__retval -eq $DIALOG_OK ] || return $__retval
201f589320aSDevin Teske
202f589320aSDevin Teske		local __member_groups
203f589320aSDevin Teske		case "$__menu_choice" in
204f589320aSDevin Teske		X) # Exit
205f589320aSDevin Teske			break ;;
206f589320aSDevin Teske		1) # Select Groups from a list
207f589320aSDevin Teske			local __check_list= # Calculated below
208f589320aSDevin Teske			local __group_list __g __grp __length=0
209f589320aSDevin Teske			__group_list=$( pw groupshow -a |
210f589320aSDevin Teske				awk -F: '!/^[[:space:]]*(#|$)/{print $1}' )
211f589320aSDevin Teske			while [ $__length -ne ${#__group_list} ]; do
212f589320aSDevin Teske				__g="${__group_list%%$NL*}" # First line
213f589320aSDevin Teske				f_shell_escape "$__g" __grp
214f589320aSDevin Teske
215f589320aSDevin Teske				# Format of a checklist entry: tag item status
216f589320aSDevin Teske				# NB: Setting both tag/item to group name below
217f589320aSDevin Teske				__check_list="$__check_list '$__grp' '$__grp'"
218f589320aSDevin Teske				case "$__input" in
219f589320aSDevin Teske				"$__g"|"$__g",*|*,"$__g",*|*,"$__g")
220f589320aSDevin Teske					__check_list="$__check_list on" ;;
221f589320aSDevin Teske				*)
222f589320aSDevin Teske					__check_list="$__check_list off"
223f589320aSDevin Teske				esac
224f589320aSDevin Teske
225f589320aSDevin Teske				__length=${#__group_list}
226f589320aSDevin Teske				__group_list="${__group_list#*$NL}" # Kill line
227f589320aSDevin Teske			done
228f589320aSDevin Teske
229f589320aSDevin Teske			local __cheight __cwidth __crows
230f589320aSDevin Teske
231f589320aSDevin Teske			eval f_dialog_checklist_size \
232f589320aSDevin Teske				__cheight __cwidth __crows \
233f589320aSDevin Teske				\"\$DIALOG_TITLE\"     \
234f589320aSDevin Teske				\"\$DIALOG_BACKTITLE\" \
235f589320aSDevin Teske				\"\$__prompt\"         \
236f589320aSDevin Teske				\"\$__hline\"          \
237f589320aSDevin Teske				$__check_list
238f589320aSDevin Teske			__member_groups=$( eval $DIALOG \
239ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"         \
240ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
241ab2043b8SDevin Teske				--separate-output                  \
242f589320aSDevin Teske				--hline \"\$__hline\"              \
243ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"            \
244ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"    \
245f589320aSDevin Teske				--checklist \"\$__prompt\"         \
246f589320aSDevin Teske				$__cheight $__cwidth $__crows      \
247f589320aSDevin Teske				$__check_list                      \
24889498fdfSDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
249f589320aSDevin Teske			) || continue
250f589320aSDevin Teske				# Return to previous menu if user either
251f589320aSDevin Teske				# pressed ESC or chose Cancel/No
252f589320aSDevin Teske			f_dialog_data_sanitize __member_groups
253f589320aSDevin Teske
254f589320aSDevin Teske			#
255f589320aSDevin Teske			# Convert the newline separated list into a comma-
256f589320aSDevin Teske			# separated one so that if the user switches over to
257f589320aSDevin Teske			# manual editing, list reflects checklist selections
258f589320aSDevin Teske			#
259f589320aSDevin Teske			f_replaceall "$__member_groups" "[$NL]" "," __input
260f589320aSDevin Teske			;;
261f589320aSDevin Teske		2) # Enter Groups manually
262f589320aSDevin Teske			local __prompt2="$msg_groups"
263f589320aSDevin Teske			__prompt2="$__prompt2 ($msg_separated_by_commas)"
264f589320aSDevin Teske
265f589320aSDevin Teske			f_dialog_input __member_groups \
266f589320aSDevin Teske			               "$__prompt2" "$__input" \
267f589320aSDevin Teske			               "$hline_num_tab_enter" || continue
268f589320aSDevin Teske				# Return to previous menu if user either
269f589320aSDevin Teske				# pressed ESC or chose Cancel/No
270ab2043b8SDevin Teske
271ab2043b8SDevin Teske			#
272ab2043b8SDevin Teske			# Validate each of the groups the user has entered
273ab2043b8SDevin Teske			#
274f589320aSDevin Teske			local __all_groups_valid=1 __grp __grp_list
275f589320aSDevin Teske			f_replaceall "$__member_groups" "," " " __grp_list
276f589320aSDevin Teske			for __grp in $__grp_list; do
277f589320aSDevin Teske				if ! f_quietly pw groupshow -n "$__grp"; then
278f589320aSDevin Teske					f_show_msg "$msg_group_not_found" \
279f589320aSDevin Teske					           "$__grp"
280f589320aSDevin Teske					__all_groups_valid=
281ab2043b8SDevin Teske					break
282ab2043b8SDevin Teske				fi
283ab2043b8SDevin Teske			done
284f589320aSDevin Teske			[ "$__all_groups_valid" ] || continue
285ab2043b8SDevin Teske
286f589320aSDevin Teske			__input="$__member_groups"
287f589320aSDevin Teske			;;
288f589320aSDevin Teske		esac
289ab2043b8SDevin Teske	done
290ab2043b8SDevin Teske
291f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
292f677a9e2SDevin Teske	return $DIALOG_OK
293ab2043b8SDevin Teske}
294ab2043b8SDevin Teske
295f589320aSDevin Teske# f_dialog_input_name $var_to_set [$name]
296ab2043b8SDevin Teske#
297ab2043b8SDevin Teske# Allows the user to enter a new username for a given user. If the user does
298f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly-
299f589320aSDevin Teske# configured value upon return.
300ab2043b8SDevin Teske#
301ab2043b8SDevin Teskef_dialog_input_name()
302ab2043b8SDevin Teske{
303f589320aSDevin Teske	local __var_to_set="$1" __name="$2"
304f589320aSDevin Teske
305ab2043b8SDevin Teske	#
306ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
307ab2043b8SDevin Teske	#
308f589320aSDevin Teske	local __input="$__name"
309ab2043b8SDevin Teske	while :; do
310ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
311f589320aSDevin Teske		f_dialog_input __input "$msg_login" "$__input" \
312f677a9e2SDevin Teske		               "$hline_alnum_tab_enter" || return $?
313ab2043b8SDevin Teske
314ab2043b8SDevin Teske		# Check for no-change
315f589320aSDevin Teske		if [ "$__input" = "$__name" ]; then
316f589320aSDevin Teske			setvar "$__var_to_set" "$__input"
317f677a9e2SDevin Teske			return $DIALOG_OK
318ab2043b8SDevin Teske		fi
319ab2043b8SDevin Teske
320ab2043b8SDevin Teske		# Check for NULL entry
321f589320aSDevin Teske		if [ ! "$__input" ]; then
3227079fc4eSDevin Teske			f_show_msg "$msg_login_is_empty"
323ab2043b8SDevin Teske			continue
324ab2043b8SDevin Teske		fi
325ab2043b8SDevin Teske
326ab2043b8SDevin Teske		# Check for invalid entry
327f589320aSDevin Teske		case "$__input" in [!a-zA-Z]*)
3287079fc4eSDevin Teske			f_show_msg "$msg_login_must_start_with_letter"
329ab2043b8SDevin Teske			continue
330f589320aSDevin Teske		esac
331ab2043b8SDevin Teske
332ab2043b8SDevin Teske		# Check for duplicate entry
333f589320aSDevin Teske		if f_quietly pw usershow -n "$__input"; then
334f589320aSDevin Teske			f_show_msg "$msg_login_already_used" "$__input"
335ab2043b8SDevin Teske			continue
336ab2043b8SDevin Teske		fi
337ab2043b8SDevin Teske
338f589320aSDevin Teske		setvar "$__var_to_set" "$__input"
339ab2043b8SDevin Teske		break
340ab2043b8SDevin Teske	done
341ab2043b8SDevin Teske
342f677a9e2SDevin Teske	return $DIALOG_OK
343ab2043b8SDevin Teske}
344ab2043b8SDevin Teske
345f589320aSDevin Teske# f_dialog_input_password $var_to_set $dvar_to_set
346ab2043b8SDevin Teske#
347f589320aSDevin Teske# Prompt the user to enter a password (twice). If the user does not cancel or
348f589320aSDevin Teske# press ESC, $var_to_set will hold the confirmed user entry. Otherwise, if the
349f589320aSDevin Teske# user cancels or enters a NULL password (twice), they are given the choice to
350f589320aSDevin Teske# disable password authentication for the given login, wherein $dvar_to_set has
351f589320aSDevin Teske# a value of 1 to indicate password authentication should be disabled.
352ab2043b8SDevin Teske#
353ab2043b8SDevin Teskef_dialog_input_password()
354ab2043b8SDevin Teske{
355f589320aSDevin Teske	local __var_to_set="$1" __dvar_to_set="$2"
356f589320aSDevin Teske	local __prompt1="$msg_password"
357f589320aSDevin Teske	local __prompt2="$msg_reenter_password"
358f589320aSDevin Teske	local __hline="$hline_alnum_punc_tab_enter"
359ab2043b8SDevin Teske
360f589320aSDevin Teske	local __height1 __width1
361f589320aSDevin Teske	f_dialog_inputbox_size __height1 __width1 \
362ab2043b8SDevin Teske	                       "$DIALOG_TITLE"     \
363ab2043b8SDevin Teske	                       "$DIALOG_BACKTITLE" \
364f589320aSDevin Teske	                       "$__prompt1"        \
365ab2043b8SDevin Teske	                       ""                  \
366f589320aSDevin Teske	                       "$__hline"
367f589320aSDevin Teske	local __height2 __width2
368f589320aSDevin Teske	f_dialog_inputbox_size __height2 __width2 \
369ab2043b8SDevin Teske	                       "$DIALOG_TITLE"     \
370ab2043b8SDevin Teske	                       "$DIALOG_BACKTITLE" \
371f589320aSDevin Teske	                       "$__prompt2"        \
372ab2043b8SDevin Teske	                       ""                  \
373f589320aSDevin Teske	                       "$__hline"
374ab2043b8SDevin Teske
375ab2043b8SDevin Teske	#
376ab2043b8SDevin Teske	# Loop until the user provides taint-free/valid input
377ab2043b8SDevin Teske	#
378f589320aSDevin Teske	local __retval __password1 __password2
379ab2043b8SDevin Teske	while :; do
380f589320aSDevin Teske		__password1=$( $DIALOG \
38174036c4dSDevin Teske			--title "$DIALOG_TITLE"         \
38274036c4dSDevin Teske			--backtitle "$DIALOG_BACKTITLE" \
383f589320aSDevin Teske			--hline "$__hline"              \
38474036c4dSDevin Teske			--ok-label "$msg_ok"            \
38574036c4dSDevin Teske			--cancel-label "$msg_cancel"    \
386ab2043b8SDevin Teske			--insecure                      \
387f589320aSDevin Teske			--passwordbox "$__prompt1"      \
388f589320aSDevin Teske			$__height1 $__width1            \
38989498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
390ec7120b5SDevin Teske		) || return $?
391ec7120b5SDevin Teske			# Return if user either pressed ESC or chose Cancel/No
392f589320aSDevin Teske		debug= f_dialog_line_sanitize __password1
393ab2043b8SDevin Teske
394f589320aSDevin Teske		__password2=$( $DIALOG \
39574036c4dSDevin Teske			--title "$DIALOG_TITLE"         \
39674036c4dSDevin Teske			--backtitle "$DIALOG_BACKTITLE" \
397f589320aSDevin Teske			--hline "$__hline"              \
39874036c4dSDevin Teske			--ok-label "$msg_ok"            \
39974036c4dSDevin Teske			--cancel-label "$msg_cancel"    \
400ab2043b8SDevin Teske			--insecure                      \
401f589320aSDevin Teske			--passwordbox "$__prompt2"      \
402f589320aSDevin Teske			$__height2 $__width2            \
40389498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
404ec7120b5SDevin Teske		) || return $?
405ec7120b5SDevin Teske			# Return if user either pressed ESC or chose Cancel/No
406f589320aSDevin Teske		debug= f_dialog_line_sanitize __password2
407ab2043b8SDevin Teske
408ab2043b8SDevin Teske		# Check for password mismatch
409f589320aSDevin Teske		if [ "$__password1" != "$__password2" ]; then
4107079fc4eSDevin Teske			f_show_msg "$msg_passwords_do_not_match"
411ab2043b8SDevin Teske			continue
412ab2043b8SDevin Teske		fi
413ab2043b8SDevin Teske
414ab2043b8SDevin Teske		# Check for NULL entry
415f589320aSDevin Teske		if [ ! "$__password1" ]; then
4167ca5c4cbSDevin Teske			f_dialog_yesno "$msg_disable_password_auth_for_account"
417f589320aSDevin Teske			__retval=$?
418f589320aSDevin Teske			if [ $__retval -eq $DIALOG_ESC ]; then
419f589320aSDevin Teske				return $__retval
420f589320aSDevin Teske			elif [ $__retval -eq $DIALOG_OK ]; then
421f589320aSDevin Teske				setvar "$__dvar_to_set" 1
422528318aeSDevin Teske			else
423350db065SDevin Teske				continue # back to password prompt
424528318aeSDevin Teske			fi
425ab2043b8SDevin Teske		else
426f589320aSDevin Teske			setvar "$__dvar_to_set" ""
427ab2043b8SDevin Teske		fi
428ab2043b8SDevin Teske
429f589320aSDevin Teske		setvar "$__var_to_set" "$__password1"
430ab2043b8SDevin Teske		break
431ab2043b8SDevin Teske	done
432ab2043b8SDevin Teske
433f677a9e2SDevin Teske	return $DIALOG_OK
434ab2043b8SDevin Teske}
435ab2043b8SDevin Teske
436f589320aSDevin Teske# f_dialog_input_gecos $var_to_set [$gecos]
437ab2043b8SDevin Teske#
438ab2043b8SDevin Teske# Allow the user to enter new GECOS information for a given user. This
439ab2043b8SDevin Teske# information is commonly used to store the ``Full Name'' of the user. If the
440f589320aSDevin Teske# user does not cancel or press ESC, the $var_to_set variable will hold the
441ab2043b8SDevin Teske# newly-configured value upon return.
442ab2043b8SDevin Teske#
443ab2043b8SDevin Teskef_dialog_input_gecos()
444ab2043b8SDevin Teske{
445f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
446ab2043b8SDevin Teske
447ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
448f589320aSDevin Teske	f_dialog_input __input "$msg_full_name" "$__input" \
449f677a9e2SDevin Teske	               "$hline_alnum_punc_tab_enter" || return $?
450ab2043b8SDevin Teske
451f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
452f677a9e2SDevin Teske	return $DIALOG_OK
453ab2043b8SDevin Teske}
454ab2043b8SDevin Teske
455f589320aSDevin Teske# f_dialog_input_uid $var_to_set [$uid]
456ab2043b8SDevin Teske#
457ab2043b8SDevin Teske# Allow the user to enter a new UID for a given user. If the user does not
458f589320aSDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured
459ab2043b8SDevin Teske# value upon return.
460ab2043b8SDevin Teske#
461ab2043b8SDevin Teskef_dialog_input_uid()
462ab2043b8SDevin Teske{
463f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
464ab2043b8SDevin Teske
465ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
466f589320aSDevin Teske	f_dialog_input __input "$msg_user_id_leave_empty_for_default" \
467f589320aSDevin Teske	               "$__input" "$hline_num_tab_enter" || return $?
468ab2043b8SDevin Teske
469f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
470f677a9e2SDevin Teske	return $DIALOG_OK
471ab2043b8SDevin Teske}
472ab2043b8SDevin Teske
473f589320aSDevin Teske# f_dialog_input_gid $var_to_set [$gid]
474ab2043b8SDevin Teske#
475ab2043b8SDevin Teske# Allow the user to enter a new primary GID for a given user. If the user does
476f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly-
477f589320aSDevin Teske# configured value upon return.
478ab2043b8SDevin Teske#
479ab2043b8SDevin Teskef_dialog_input_gid()
480ab2043b8SDevin Teske{
481f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
482ab2043b8SDevin Teske
483ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
484f589320aSDevin Teske	f_dialog_input __input "$msg_group_id_leave_empty_for_default" \
485f589320aSDevin Teske	               "$__input" "$hline_num_tab_enter" || return $?
486ab2043b8SDevin Teske
487f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
488f677a9e2SDevin Teske	return $DIALOG_OK
489ab2043b8SDevin Teske}
490ab2043b8SDevin Teske
491f589320aSDevin Teske# f_dialog_input_class $var_to_set [$class]
492ab2043b8SDevin Teske#
493ab2043b8SDevin Teske# Allow the user to enter a new login class for a given user. If the user does
494f589320aSDevin Teske# not cancel or press ESC, the $var_to_set variable will hold the newly-
495ab2043b8SDevin Teske# configured value upon return.
496ab2043b8SDevin Teske#
497ab2043b8SDevin Teskef_dialog_input_class()
498ab2043b8SDevin Teske{
499f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
500ab2043b8SDevin Teske
501ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
502f589320aSDevin Teske	f_dialog_input __input "$msg_login_class" "$__input" \
503f677a9e2SDevin Teske	               "$hline_alnum_tab_enter" || return $?
504ab2043b8SDevin Teske
505f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
506f677a9e2SDevin Teske	return $DIALOG_OK
507ab2043b8SDevin Teske}
508ab2043b8SDevin Teske
509f589320aSDevin Teske# f_dialog_input_expire_password $var_to_set [$seconds]
510ab2043b8SDevin Teske#
511ab2043b8SDevin Teske# Allow the user to enter a date/time (in number-of-seconds since the `epoch')
512ab2043b8SDevin Teske# for when a given user's password must be changed. If the user does not cancel
513f589320aSDevin Teske# or press ESC, the $var_to_set variable will hold the newly-configured value
514f589320aSDevin Teske# upon return.
515ab2043b8SDevin Teske#
5163b4e3098SDevin Teskef_dialog_input_expire_password()
517ab2043b8SDevin Teske{
518f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
519f589320aSDevin Teske	local __prompt="$msg_password_expires_on"
520f589320aSDevin Teske	local __menu_list="
521ab2043b8SDevin Teske		'1' '$msg_password_does_not_expire'
522ab2043b8SDevin Teske		'2' '$msg_edit_date_time_with_a_calendar'
523f589320aSDevin Teske		'3' '$msg_enter_value_manually'
524ab2043b8SDevin Teske	" # END-QUOTE
525f589320aSDevin Teske	local __defaultitem= # Calculated below
526f589320aSDevin Teske	local __hline="$hline_num_arrows_tab_enter"
527ab2043b8SDevin Teske
528f589320aSDevin Teske	local __mheight __mwidth __mrows
529f589320aSDevin Teske	eval f_dialog_menu_size __mheight __mwidth __mrows \
530ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
531ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
532f589320aSDevin Teske	                        \"\$__prompt\"         \
533f589320aSDevin Teske	                        \"\$__hline\"          \
534f589320aSDevin Teske	                        $__menu_list
535f589320aSDevin Teske	local __cheight __cwidth
536f589320aSDevin Teske	f_dialog_calendar_size __cheight __cwidth \
53774036c4dSDevin Teske	                       "$DIALOG_TITLE"     \
53874036c4dSDevin Teske	                       "$DIALOG_BACKTITLE" \
539f589320aSDevin Teske	                       "$__prompt"         \
540f589320aSDevin Teske	                       "$__hline"
541f589320aSDevin Teske	local __theight __twidth
542f589320aSDevin Teske	f_dialog_timebox_size __theight __twidth \
54374036c4dSDevin Teske	                      "$DIALOG_TITLE"     \
54474036c4dSDevin Teske	                      "$DIALOG_BACKTITLE" \
545f589320aSDevin Teske	                      "$__prompt"         \
546f589320aSDevin Teske	                      "$__hline"
547ab2043b8SDevin Teske
54874036c4dSDevin Teske	#
54974036c4dSDevin Teske	# Loop until the user provides taint-free/cancellation-free input
55074036c4dSDevin Teske	#
551f589320aSDevin Teske	local __retval __date_type
55274036c4dSDevin Teske	while :; do
553f589320aSDevin Teske		__date_type=$( eval $DIALOG \
554ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
555ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
556f589320aSDevin Teske			--hline \"\$__hline\"              \
557f589320aSDevin Teske			--default-item \"\$__defaultitem\" \
558ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
559ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
560f589320aSDevin Teske			--menu \"\$__prompt\"              \
561f589320aSDevin Teske			$__mheight $__mwidth $__mrows      \
562f589320aSDevin Teske			$__menu_list                       \
56389498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
56489498fdfSDevin Teske		)
565f589320aSDevin Teske		__retval=$?
566f589320aSDevin Teske		f_dialog_data_sanitize __date_type
567f589320aSDevin Teske		__defaultitem="$__date_type"
568f589320aSDevin Teske		f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type"
569ab2043b8SDevin Teske
570ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
571f589320aSDevin Teske		[ $__retval -eq $DIALOG_OK ] || return $__retval
572ab2043b8SDevin Teske
573f589320aSDevin Teske		case "$__date_type" in
574ab2043b8SDevin Teske		1) # Password does not expire
575f589320aSDevin Teske			__input= break ;;
576ab2043b8SDevin Teske
577ab2043b8SDevin Teske		2) # Edit date/time with a calendar
578f589320aSDevin Teske			local __input_date __input_time __ret_date __ret_time
579ab2043b8SDevin Teske
580f589320aSDevin Teske			local __seconds="$__input"
581f589320aSDevin Teske			{ f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } ||
582f589320aSDevin Teske				__seconds=
583f589320aSDevin Teske			__input_date=$( date -j -f "%s" -- "$__seconds" \
584fb7d723eSDevin Teske			               		"+%d %m %Y" 2> /dev/null )
585f589320aSDevin Teske			__ret_date=$( eval $DIALOG \
586ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"          \
587ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\"  \
588f589320aSDevin Teske				--hline \"\$__hline\"               \
589ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"             \
590ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"     \
591f589320aSDevin Teske				--calendar \"\$__prompt\"           \
592f589320aSDevin Teske				$__cheight $__cwidth                \
593f589320aSDevin Teske				$__input_date                       \
59489498fdfSDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
59589498fdfSDevin Teske			)
596f589320aSDevin Teske			__retval=$?
597f589320aSDevin Teske			f_dialog_data_sanitize __ret_date
598f589320aSDevin Teske			f_dprintf "retval=%u ret_date=[%s]" \
599f589320aSDevin Teske			          $__retval "$__ret_date"
600ab2043b8SDevin Teske
601ab2043b8SDevin Teske			# Return to menu if either ESC or Cancel/No
602f589320aSDevin Teske			[ $__retval -eq $DIALOG_OK ] || continue
603ab2043b8SDevin Teske
604f589320aSDevin Teske			__input_time=
605f589320aSDevin Teske			[ "$__seconds" ] && __input_time=$( date -j \
606f589320aSDevin Teske				-f %s -- "$__input" "+%H %M %S" 2> /dev/null )
607f589320aSDevin Teske			__ret_time=$( eval $DIALOG \
608ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"         \
609ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
610f589320aSDevin Teske				--hline \"\$__hline\"              \
611ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"            \
612ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"    \
613f589320aSDevin Teske				--timebox \"\$__prompt\"           \
614f589320aSDevin Teske				$__theight $__twidth               \
615f589320aSDevin Teske				$__input_time                      \
61689498fdfSDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
61789498fdfSDevin Teske			)
618f589320aSDevin Teske			__retval=$?
619f589320aSDevin Teske			f_dialog_data_sanitize __ret_time
620f589320aSDevin Teske			f_dprintf "retval=%u ret_time=[%s]" \
621f589320aSDevin Teske			          $__retval "$__ret_time"
622ab2043b8SDevin Teske
623ab2043b8SDevin Teske			# Return to menu if either ESC or Cancel/No
624f589320aSDevin Teske			[ $__retval -eq $DIALOG_OK ] || continue
625ab2043b8SDevin Teske
626f589320aSDevin Teske			__input=$( date -j -f "%d/%m/%Y %T" -- \
627f589320aSDevin Teske				"$__ret_date $__ret_time" +%s 2> /dev/null )
628f589320aSDevin Teske			f_dprintf "input=[%s]" "$__input"
629ab2043b8SDevin Teske			break ;;
630ab2043b8SDevin Teske
631f589320aSDevin Teske		3) # Enter value manually
632f589320aSDevin Teske			local __msg __new_input
633f589320aSDevin Teske			f_sprintf __msg "$msg_password_expire_manual_edit" \
634f589320aSDevin Teske			                "$( date -r 0 "+%c %Z" )"
635ab2043b8SDevin Teske
636ab2043b8SDevin Teske			# Return to menu if either ESC or Cancel/No
637f589320aSDevin Teske			f_dialog_input __new_input \
638f589320aSDevin Teske				"$__msg" "$__input" "$__hline" || continue
639ab2043b8SDevin Teske
640f589320aSDevin Teske			__input="$__new_input"
641f589320aSDevin Teske			f_dprintf "input=[%s]" "$__input"
642ab2043b8SDevin Teske			break ;;
643ab2043b8SDevin Teske
644ab2043b8SDevin Teske		esac
645ab2043b8SDevin Teske
646ab2043b8SDevin Teske	done # Loop forever
647ab2043b8SDevin Teske
648f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
649f677a9e2SDevin Teske	return $DIALOG_OK
650ab2043b8SDevin Teske}
651ab2043b8SDevin Teske
652f589320aSDevin Teske# f_dialog_input_expire_account $var_to_set [$seconds]
653ab2043b8SDevin Teske#
654ab2043b8SDevin Teske# Allow the user to enter a date/time (in number-of-seconds since the `epoch')
655ab2043b8SDevin Teske# for when a given user's account should become expired. If the user does not
656f589320aSDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured
657f589320aSDevin Teske# value upon return.
658ab2043b8SDevin Teske#
6593b4e3098SDevin Teskef_dialog_input_expire_account()
660ab2043b8SDevin Teske{
661f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
662f589320aSDevin Teske	local __prompt="$msg_account_expires_on"
663f589320aSDevin Teske	local __menu_list="
664ab2043b8SDevin Teske		'1' '$msg_account_does_not_expire'
665ab2043b8SDevin Teske		'2' '$msg_edit_date_time_with_a_calendar'
666f589320aSDevin Teske		'3' '$msg_enter_value_manually'
667ab2043b8SDevin Teske	" # END-QUOTE
668f589320aSDevin Teske	local __defaultitem= # Calculated below
669f589320aSDevin Teske	local __hline="$hline_num_arrows_tab_enter"
670ab2043b8SDevin Teske
671f589320aSDevin Teske	local __mheight __mwidth __mrows
672f589320aSDevin Teske	eval f_dialog_menu_size __mheight __mwidth __mrows \
673ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
674ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
675f589320aSDevin Teske	                        \"\$__prompt\"         \
676f589320aSDevin Teske	                        \"\$__hline\"          \
677f589320aSDevin Teske	                        $__menu_list
678f589320aSDevin Teske	local __cheight __cwidth
679f589320aSDevin Teske	f_dialog_calendar_size __cheight __cwidth \
68074036c4dSDevin Teske	                       "$DIALOG_TITLE"     \
68174036c4dSDevin Teske	                       "$DIALOG_BACKTITLE" \
682f589320aSDevin Teske	                       "$__prompt"         \
683f589320aSDevin Teske	                       "$__hline"
684f589320aSDevin Teske	local __theight __twidth
685f589320aSDevin Teske	f_dialog_timebox_size __theight __twidth \
68674036c4dSDevin Teske	                      "$DIALOG_TITLE"     \
68774036c4dSDevin Teske	                      "$DIALOG_BACKTITLE" \
688f589320aSDevin Teske	                      "$__prompt"         \
689f589320aSDevin Teske	                      "$__hline"
690ab2043b8SDevin Teske
69174036c4dSDevin Teske	#
69274036c4dSDevin Teske	# Loop until the user provides taint-free/cancellation-free input
69374036c4dSDevin Teske	#
694f589320aSDevin Teske	local __retval __date_type
69574036c4dSDevin Teske	while :; do
696f589320aSDevin Teske		__date_type=$( eval $DIALOG \
697ab2043b8SDevin Teske			--title \"\$DIALOG_TITLE\"         \
698ab2043b8SDevin Teske			--backtitle \"\$DIALOG_BACKTITLE\" \
699f589320aSDevin Teske			--hline \"\$__hline\"              \
700f589320aSDevin Teske			--default-item \"\$__defaultitem\" \
701ab2043b8SDevin Teske			--ok-label \"\$msg_ok\"            \
702ab2043b8SDevin Teske			--cancel-label \"\$msg_cancel\"    \
703f589320aSDevin Teske			--menu \"\$__prompt\"              \
704f589320aSDevin Teske			$__mheight $__mwidth $__mrows      \
705f589320aSDevin Teske			$__menu_list                       \
70689498fdfSDevin Teske			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
70789498fdfSDevin Teske		)
708f589320aSDevin Teske		__retval=$?
709f589320aSDevin Teske		f_dialog_data_sanitize __date_type
710f589320aSDevin Teske		__defaultitem="$__date_type"
711f589320aSDevin Teske		f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type"
712ab2043b8SDevin Teske
713ab2043b8SDevin Teske		# Return if user has either pressed ESC or chosen Cancel/No
714f589320aSDevin Teske		[ $__retval -eq $DIALOG_OK ] || return $__retval
715ab2043b8SDevin Teske
716f589320aSDevin Teske		case "$__date_type" in
717ab2043b8SDevin Teske		1) # Account does not expire
718f589320aSDevin Teske			__input= break ;;
719ab2043b8SDevin Teske
720ab2043b8SDevin Teske		2) # Edit date/time with a calendar
721f589320aSDevin Teske			local __input_date __input_time __ret_date __ret_time
722ab2043b8SDevin Teske
723f589320aSDevin Teske			local __seconds="$__input"
724f589320aSDevin Teske			{ f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } ||
725f589320aSDevin Teske				__seconds=
726f589320aSDevin Teske			__input_date=$( date -j -f "%s" -- "$__seconds" \
727fb7d723eSDevin Teske			               		"+%d %m %Y" 2> /dev/null )
728f589320aSDevin Teske			__ret_date=$( eval $DIALOG \
729ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"          \
730ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\"  \
731f589320aSDevin Teske				--hline \"\$__hline\"               \
732ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"             \
733ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"     \
734f589320aSDevin Teske				--calendar \"\$__prompt\"           \
735f589320aSDevin Teske				$__cheight $__cwidth                \
736f589320aSDevin Teske				$__input_date                       \
73789498fdfSDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
73889498fdfSDevin Teske			)
739f589320aSDevin Teske			__retval=$?
740f589320aSDevin Teske			f_dialog_data_sanitize __ret_date
741f589320aSDevin Teske			f_dprintf "retval=%u ret_date=[%s]" \
742f589320aSDevin Teske			          $__retval "$__ret_date"
743ab2043b8SDevin Teske
744ab2043b8SDevin Teske			# Return to menu if either ESC or Cancel/No
745f589320aSDevin Teske			[ $__retval -eq $DIALOG_OK ] || continue
746ab2043b8SDevin Teske
747f589320aSDevin Teske			__input_time=
748f589320aSDevin Teske			[ "$__seconds" ] && __input_time=$( date -j \
749f589320aSDevin Teske				-f %s -- "$__input" "+%H %M %S" 2> /dev/null )
750f589320aSDevin Teske			__ret_time=$( eval $DIALOG \
751ab2043b8SDevin Teske				--title \"\$DIALOG_TITLE\"         \
752ab2043b8SDevin Teske				--backtitle \"\$DIALOG_BACKTITLE\" \
753f589320aSDevin Teske				--hline \"\$__hline\"              \
754ab2043b8SDevin Teske				--ok-label \"\$msg_ok\"            \
755ab2043b8SDevin Teske				--cancel-label \"\$msg_cancel\"    \
756f589320aSDevin Teske				--timebox \"\$__prompt\"           \
757f589320aSDevin Teske				$__theight $__twidth               \
758f589320aSDevin Teske				$__input_time                      \
75989498fdfSDevin Teske				2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
76089498fdfSDevin Teske			)
761f589320aSDevin Teske			__retval=$?
762f589320aSDevin Teske			f_dialog_data_sanitize __ret_time
763f589320aSDevin Teske			f_dprintf "retval=%u ret_time=[%s]" \
764f589320aSDevin Teske			          $__retval "$__ret_time"
765ab2043b8SDevin Teske
766ab2043b8SDevin Teske			# Return to menu if either ESC or Cancel/No
767f589320aSDevin Teske			[ $__retval -eq $DIALOG_OK ] || continue
768ab2043b8SDevin Teske
769f589320aSDevin Teske			__input=$( date -j -f "%d/%m/%Y %T" -- \
770f589320aSDevin Teske				"$ret_date $ret_time" +%s 2> /dev/null )
771f589320aSDevin Teske			f_dprintf "input=[%s]" "$__input"
772ab2043b8SDevin Teske			break ;;
773ab2043b8SDevin Teske
774f589320aSDevin Teske		3) # Enter value manually
775f589320aSDevin Teske			local __msg __new_input
776f589320aSDevin Teske			f_sprintf __msg "$msg_account_expire_manual_edit" \
777f589320aSDevin Teske			                "$( date -r 0 "+%c %Z" )"
778ab2043b8SDevin Teske
779ab2043b8SDevin Teske			# Return to menu if either ESC or Cancel/No
780f589320aSDevin Teske			f_dialog_input __new_input \
781f589320aSDevin Teske				"$__msg" "$__input" "$__hline" || continue
782ab2043b8SDevin Teske
783f589320aSDevin Teske			__input="$__new_input"
784f589320aSDevin Teske			f_dprintf "input=[%s]" "$__input"
785ab2043b8SDevin Teske			break ;;
786ab2043b8SDevin Teske
787ab2043b8SDevin Teske		esac
788ab2043b8SDevin Teske
789ab2043b8SDevin Teske	done # Loop forever
790ab2043b8SDevin Teske
791f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
792f677a9e2SDevin Teske	return $DIALOG_OK
793ab2043b8SDevin Teske}
794ab2043b8SDevin Teske
795f589320aSDevin Teske# f_dialog_input_home_dir $var_to_set [$home_dir]
796ab2043b8SDevin Teske#
797f589320aSDevin Teske# Allow the user to enter a new home directory for a given login. If the user
798f589320aSDevin Teske# does not cancel or press ESC, the $var_to_set variable will hold the newly-
799ab2043b8SDevin Teske# configured value upon return.
800ab2043b8SDevin Teske#
801ab2043b8SDevin Teskef_dialog_input_home_dir()
802ab2043b8SDevin Teske{
803f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
804ab2043b8SDevin Teske
805ab2043b8SDevin Teske	# Return if user has either pressed ESC or chosen Cancel/No
806f589320aSDevin Teske	f_dialog_input __input "$msg_home_directory" "$__input" \
807f677a9e2SDevin Teske	               "$hline_alnum_punc_tab_enter" || return $?
808ab2043b8SDevin Teske
809f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
810f677a9e2SDevin Teske	return $DIALOG_OK
811ab2043b8SDevin Teske}
812ab2043b8SDevin Teske
813f589320aSDevin Teske# f_dialog_input_home_create $var_to_set
814ab2043b8SDevin Teske#
815f589320aSDevin Teske# Prompt the user to confirm creation of a given login's home directory. If the
816f589320aSDevin Teske# user does not cancel (by choosing "No") or press ESC, the $var_to_set
817ab2043b8SDevin Teske# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return
818ab2043b8SDevin Teske# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible.
819ab2043b8SDevin Teske#
820ab2043b8SDevin Teskef_dialog_input_home_create()
821ab2043b8SDevin Teske{
822f589320aSDevin Teske	local __var_to_set="$1"
823ab2043b8SDevin Teske
824ab2043b8SDevin Teske	f_dialog_yesno "$msg_create_home_directory"
825f589320aSDevin Teske	local __retval=$?
826ab2043b8SDevin Teske
827f589320aSDevin Teske	if [ $__retval -eq $DIALOG_OK ]; then
828f589320aSDevin Teske		setvar "$__var_to_set" "$msg_yes"
829ab2043b8SDevin Teske	else
830f589320aSDevin Teske		setvar "$__var_to_set" "$msg_no"
831ab2043b8SDevin Teske	fi
832ab2043b8SDevin Teske
833f589320aSDevin Teske	[ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
834ab2043b8SDevin Teske}
835ab2043b8SDevin Teske
836f589320aSDevin Teske# f_dialog_input_group_delete $var_to_set [$group]
837ab2043b8SDevin Teske#
838f589320aSDevin Teske# Prompt the user to confirm deletion of a given login's primary group. If the
839f589320aSDevin Teske# user does not cancel (by choosing "No") or press ESC, the $var_to_set
840ab2043b8SDevin Teske# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return
841ab2043b8SDevin Teske# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible.
842ab2043b8SDevin Teske#
843ab2043b8SDevin Teskef_dialog_input_group_delete()
844ab2043b8SDevin Teske{
845f589320aSDevin Teske	local __var_to_set="$1" __group="$2"
846ab2043b8SDevin Teske
847f589320aSDevin Teske	if f_isinteger "$__group"; then
848f589320aSDevin Teske		if [ $__group -lt 1000 ]; then
849ab2043b8SDevin Teske			f_dialog_noyes "$msg_delete_primary_group"
850ab2043b8SDevin Teske		else
851ab2043b8SDevin Teske			f_dialog_yesno "$msg_delete_primary_group"
852ab2043b8SDevin Teske		fi
853f589320aSDevin Teske	elif [ "$__group" ]; then
854f589320aSDevin Teske		local __gid=0
855f589320aSDevin Teske		__gid=$( pw groupshow "$__group" | awk -F: '{print $3}' )
856f589320aSDevin Teske		if f_isinteger "$__gid" && [ $__gid -lt 1000 ]; then
857ab2043b8SDevin Teske			f_dialog_noyes "$msg_delete_primary_group"
858ab2043b8SDevin Teske		else
859ab2043b8SDevin Teske			f_dialog_yesno "$msg_delete_primary_group"
860ab2043b8SDevin Teske		fi
861ab2043b8SDevin Teske	else
862ab2043b8SDevin Teske		f_dialog_yesno "$msg_delete_primary_group"
863ab2043b8SDevin Teske	fi
864f589320aSDevin Teske	local __retval=$?
865ab2043b8SDevin Teske
866f589320aSDevin Teske	if [ $__retval -eq $DIALOG_OK ]; then
867f589320aSDevin Teske		setvar "$__var_to_set" "$msg_yes"
868ab2043b8SDevin Teske	else
869f589320aSDevin Teske		setvar "$__var_to_set" "$msg_no"
870ab2043b8SDevin Teske	fi
871ab2043b8SDevin Teske
872f589320aSDevin Teske	[ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
873ab2043b8SDevin Teske}
874ab2043b8SDevin Teske
875f589320aSDevin Teske# f_dialog_input_home_delete $var_to_set
876ab2043b8SDevin Teske#
877f589320aSDevin Teske# Prompt the user to confirm deletion of a given login's home directory. If the
878f589320aSDevin Teske# user does not cancel (by choosing "No") or press ESC, the $var_to_set
879ab2043b8SDevin Teske# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return
880ab2043b8SDevin Teske# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible.
881ab2043b8SDevin Teske#
882ab2043b8SDevin Teskef_dialog_input_home_delete()
883ab2043b8SDevin Teske{
884f589320aSDevin Teske	local __var_to_set="$1"
885ab2043b8SDevin Teske
886ab2043b8SDevin Teske	f_dialog_yesno "$msg_delete_home_directory"
887f589320aSDevin Teske	local __retval=$?
888ab2043b8SDevin Teske
889f589320aSDevin Teske	if [ $__retval -eq $DIALOG_OK ]; then
890f589320aSDevin Teske		setvar "$__var_to_set" "$msg_yes"
891ab2043b8SDevin Teske	else
892f589320aSDevin Teske		setvar "$__var_to_set" "$msg_no"
893ab2043b8SDevin Teske	fi
894ab2043b8SDevin Teske
895f589320aSDevin Teske	[ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
896ab2043b8SDevin Teske}
897ab2043b8SDevin Teske
898f589320aSDevin Teske# f_dialog_input_dotfiles_create $var_to_set
899ab2043b8SDevin Teske#
900f589320aSDevin Teske# Prompt the user to confirm population of a given login's home directory with
901ab2043b8SDevin Teske# sample dotfiles. If the user does not cancel (by choosing "No") or press ESC,
902f589320aSDevin Teske# the $var_to_set variable will hold $msg_yes upon return, otherwise $msg_no.
903f589320aSDevin Teske# Use these return variables ($msg_yes and $msg_no) for comparison to be i18n-
904f589320aSDevin Teske# compatible.
905ab2043b8SDevin Teske#
906ab2043b8SDevin Teskef_dialog_input_dotfiles_create()
907ab2043b8SDevin Teske{
908f589320aSDevin Teske	local __var_to_set="$1"
909ab2043b8SDevin Teske
910ab2043b8SDevin Teske	f_dialog_yesno "$msg_create_dotfiles"
911f589320aSDevin Teske	local __retval=$?
912ab2043b8SDevin Teske
913f589320aSDevin Teske	if [ $__retval -eq $DIALOG_OK ]; then
914f589320aSDevin Teske		setvar "$__var_to_set" "$msg_yes"
915ab2043b8SDevin Teske	else
916f589320aSDevin Teske		setvar "$__var_to_set" "$msg_no"
917ab2043b8SDevin Teske	fi
918ab2043b8SDevin Teske
919f589320aSDevin Teske	[ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
920ab2043b8SDevin Teske}
921ab2043b8SDevin Teske
922f589320aSDevin Teske# f_dialog_input_shell $var_to_set [$shell]
923ab2043b8SDevin Teske#
924f589320aSDevin Teske# Allow the user to select a new shell for a given login. If the user does not
925f589320aSDevin Teske# cancel or press ESC, the $var_to_set variable will hold the newly-configured
926f589320aSDevin Teske# value upon return.
927ab2043b8SDevin Teske#
928ab2043b8SDevin Teskef_dialog_input_shell()
929ab2043b8SDevin Teske{
930f589320aSDevin Teske	local __funcname=f_dialog_input_shell
931f589320aSDevin Teske	local __var_to_set="$1" __input="$2"
932f589320aSDevin Teske	local __prompt="$msg_select_login_shell"
933f589320aSDevin Teske	local __radio_list= # Calculated below
934f589320aSDevin Teske	local __defaultitem="$2"
935f589320aSDevin Teske	local __hline="$hline_arrows_space_tab_enter"
936ab2043b8SDevin Teske
937052f8969SDevin Teske	#
938052f8969SDevin Teske	# Generate the radiolist of shells
939052f8969SDevin Teske	#
940f589320aSDevin Teske	local __shell_list __s __shell __length=0
941f589320aSDevin Teske	f_eval_catch -k __shell_list $__funcname awk "awk '%s' \"%s\"" \
942f589320aSDevin Teske		'!/^[[:space:]]*(#|$)/{print}' "$ETC_SHELLS" || return $FAILURE
943f589320aSDevin Teske	while [ $__length -ne ${#__shell_list} ]; do
944f589320aSDevin Teske		__s="${__shell_list%%$NL*}" # First line
945f589320aSDevin Teske		f_shell_escape "$__s" __shell
946f589320aSDevin Teske
947f589320aSDevin Teske		# Format of a radiolist entry: tag item status
948f589320aSDevin Teske		if [ "$__s" = "$__input" ]; then
949f589320aSDevin Teske			__radio_list="$__radio_list '$__shell' '' 'on'"
950ab2043b8SDevin Teske		else
951f589320aSDevin Teske			__radio_list="$__radio_list '$__shell' '' 'off'"
952ab2043b8SDevin Teske		fi
953f589320aSDevin Teske
954f589320aSDevin Teske		__length=${#__shell_list}
955f589320aSDevin Teske		__shell_list="${__shell_list#*$NL}" # Kill line
956ab2043b8SDevin Teske	done
957ab2043b8SDevin Teske
958f589320aSDevin Teske	local __height __width __rows
959f589320aSDevin Teske	eval f_dialog_radiolist_size __height __width __rows \
960f589320aSDevin Teske	                             \"\$DIALOG_TITLE\"     \
961f589320aSDevin Teske	                             \"\$DIALOG_BACKTITLE\" \
962f589320aSDevin Teske	                             \"\$__prompt\"         \
963f589320aSDevin Teske	                             \"\$__hline\"          \
964f589320aSDevin Teske	                             $__radio_list
965f589320aSDevin Teske
966f589320aSDevin Teske	__input=$( eval $DIALOG \
967f589320aSDevin Teske		--title \"\$DIALOG_TITLE\"         \
968f589320aSDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
969f589320aSDevin Teske		--hline \"\$__hline\"              \
970f589320aSDevin Teske		--ok-label \"\$msg_ok\"            \
971f589320aSDevin Teske		--cancel-label \"\$msg_cancel\"    \
972f589320aSDevin Teske		--default-item \"\$__defaultitem\" \
973f589320aSDevin Teske		--radiolist \"\$__prompt\"         \
974f589320aSDevin Teske		$__height $__width $__rows         \
975f589320aSDevin Teske		$__radio_list                      \
976f589320aSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
977f589320aSDevin Teske	) || return $?
978f589320aSDevin Teske		# Return if user either pressed ESC or chose Cancel/No
979f589320aSDevin Teske	f_dialog_data_sanitize __input
980f589320aSDevin Teske
981f589320aSDevin Teske	setvar "$__var_to_set" "$__input"
982f589320aSDevin Teske	return $DIALOG_OK
983f589320aSDevin Teske}
984f589320aSDevin Teske
985f589320aSDevin Teske# f_dialog_menu_user_add [$defaultitem]
986f589320aSDevin Teske#
987f589320aSDevin Teske# Present a menu detailing the properties of a login that is about to be added.
988f589320aSDevin Teske# The user's menu choice is available using f_dialog_menutag_fetch(). Returns
989f589320aSDevin Teske# success unless the user chose Cancel or pressed ESC. Data to display is taken
990f589320aSDevin Teske# from environment variables user_account_expire, user_class,
991f589320aSDevin Teske# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir,
992f589320aSDevin Teske# user_member_groups, user_name, user_password_expire, user_shell, and
993f589320aSDevin Teske# user_uid. If $defaultitem is present and non-NULL, initially highlight the
994f589320aSDevin Teske# item in the menu.
995f589320aSDevin Teske#
996f589320aSDevin Teskef_dialog_menu_user_add()
997f589320aSDevin Teske{
998f589320aSDevin Teske	local funcname=f_dialog_menu_user_add
999f589320aSDevin Teske	local prompt="$msg_save_exit_or_cancel"
1000f589320aSDevin Teske	local menu_list # Calculated below
1001f589320aSDevin Teske	local defaultitem="$1"
1002f589320aSDevin Teske	local hline="$hline_arrows_tab_enter"
1003f589320aSDevin Teske
1004f589320aSDevin Teske	# Attempt to convert numeric UNIX time to calendar date/time
1005f589320aSDevin Teske	local user_account_expires_on=
1006f589320aSDevin Teske	if f_isinteger "$user_account_expire"; then
1007f589320aSDevin Teske		[ "$user_account_expire" -ne 0 ] && user_account_expires_on=$(
1008f589320aSDevin Teske			date -r "$user_account_expire" "+%F %T %Z"
1009f589320aSDevin Teske		)
1010f589320aSDevin Teske	else
1011f589320aSDevin Teske		user_account_expires_on="$user_account_expire"
1012f589320aSDevin Teske	fi
1013f589320aSDevin Teske	local user_password_expires_on=
1014f589320aSDevin Teske	if f_isinteger "$user_password_expire"; then
1015f589320aSDevin Teske		[ $user_password_expire -ne 0 ] && user_password_expires_on=$(
1016f589320aSDevin Teske			date -r "$user_password_expire" "+%F %T %Z"
1017f589320aSDevin Teske		)
1018f589320aSDevin Teske	else
1019f589320aSDevin Teske		user_password_expires_on="$user_password_expire"
1020f589320aSDevin Teske	fi
1021f589320aSDevin Teske
1022f589320aSDevin Teske	# Localize potentially hostile variables and escape their values
1023f589320aSDevin Teske	# to the local variable (see f_shell_escape() of `strings.subr')
1024f589320aSDevin Teske	local var
1025f589320aSDevin Teske	for var in account_expires_on class dotfiles_create gecos gid \
1026f589320aSDevin Teske		home_create home_dir member_groups name password_expires_on \
1027f589320aSDevin Teske		shell uid \
1028f589320aSDevin Teske	; do
1029f589320aSDevin Teske		local _user_$var
1030f589320aSDevin Teske		eval f_shell_escape \"\$user_$var\" _user_$var
1031f589320aSDevin Teske	done
1032f589320aSDevin Teske
1033*389e4940SDevin Teske	# Attempt to translate a numeric GID into `number (name)'
1034*389e4940SDevin Teske	if f_isinteger "$_user_gid"; then
1035*389e4940SDevin Teske		local _user_group
1036*389e4940SDevin Teske		_user_group=$( pw groupshow -g "$_user_gid" 2> /dev/null ) &&
1037*389e4940SDevin Teske			_user_group="${_user_group%%:*}" &&
1038*389e4940SDevin Teske			f_shell_escape "$_user_gid ($_user_group)" _user_gid
1039*389e4940SDevin Teske	fi
1040*389e4940SDevin Teske
1041f589320aSDevin Teske	menu_list="
1042f589320aSDevin Teske		'X' '$msg_add/$msg_exit'
1043f589320aSDevin Teske		'1' '$msg_login: $_user_name'
1044f589320aSDevin Teske		'2' '$msg_full_name: $_user_gecos'
1045f589320aSDevin Teske		'3' '$msg_password: -----'
1046f589320aSDevin Teske		'4' '$msg_user_id: $_user_uid'
1047f589320aSDevin Teske		'5' '$msg_group_id: $_user_gid'
1048f589320aSDevin Teske		'6' '$msg_member_of_groups: $_user_member_groups'
1049f589320aSDevin Teske		'7' '$msg_login_class: $_user_class'
1050f589320aSDevin Teske		'8' '$msg_password_expires_on: $_user_password_expires_on'
1051f589320aSDevin Teske		'9' '$msg_account_expires_on: $_user_account_expires_on'
1052f589320aSDevin Teske		'A' '$msg_home_directory: $_user_home_dir'
1053f589320aSDevin Teske		'B' '$msg_shell: $_user_shell'
1054f589320aSDevin Teske	" # END-QUOTE
1055f589320aSDevin Teske	case "$user_home_dir" in
1056f589320aSDevin Teske	/|/nonexistent|/var/empty) menu_list="$menu_list
1057f589320aSDevin Teske		'-' '$msg_create_home_directory: $msg_n_a'
1058f589320aSDevin Teske		'-' '$msg_create_dotfiles: $msg_n_a'
1059f589320aSDevin Teske	   " # END-QUOTE
1060f589320aSDevin Teske	   ;;
1061f589320aSDevin Teske	*) if [ -d "$user_home_dir" ]; then menu_list="$menu_list
1062f589320aSDevin Teske		'-' '$msg_create_home_directory: $msg_n_a'
1063f589320aSDevin Teske		'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
1064f589320aSDevin Teske	   " # END-QUOTE
1065f589320aSDevin Teske	   else menu_list="$menu_list
1066f589320aSDevin Teske		'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}'
1067f589320aSDevin Teske		'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
1068f589320aSDevin Teske	   " # END-QUOTE
1069f589320aSDevin Teske	   fi
1070f589320aSDevin Teske	esac
1071f589320aSDevin Teske
107274036c4dSDevin Teske	local height width rows
1073f589320aSDevin Teske	eval f_dialog_menu_size height width rows \
1074ab2043b8SDevin Teske	                        \"\$DIALOG_TITLE\"     \
1075ab2043b8SDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
1076ab2043b8SDevin Teske	                        \"\$prompt\"           \
1077ab2043b8SDevin Teske	                        \"\$hline\"            \
1078f589320aSDevin Teske	                        $menu_list
1079ab2043b8SDevin Teske
1080f589320aSDevin Teske	local menu_choice
1081f589320aSDevin Teske	menu_choice=$( eval $DIALOG \
1082ab2043b8SDevin Teske		--title \"\$DIALOG_TITLE\"         \
1083ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
1084ab2043b8SDevin Teske		--hline \"\$hline\"                \
1085ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
1086ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
1087f589320aSDevin Teske		--default-item \"\$defaultitem\"   \
1088f589320aSDevin Teske		--keep-tite                        \
1089f589320aSDevin Teske		--menu \"\$prompt\"                \
109074036c4dSDevin Teske		$height $width $rows               \
1091f589320aSDevin Teske		$menu_list                         \
109289498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
1093f589320aSDevin Teske	)
1094f589320aSDevin Teske	local retval=$?
1095f589320aSDevin Teske	f_dialog_data_sanitize menu_choice
1096f589320aSDevin Teske	f_dialog_menutag_store "$menu_choice"
1097f589320aSDevin Teske	return $retval
1098f589320aSDevin Teske}
1099ab2043b8SDevin Teske
1100f589320aSDevin Teske# f_dialog_menu_user_delete $user [$defaultitem]
1101f589320aSDevin Teske#
1102f589320aSDevin Teske# Present a menu detailing the properties of a login that is about to be
1103f589320aSDevin Teske# deleted. The user's menu choice is available using f_dialog_menutag_fetch().
1104f589320aSDevin Teske# Returns success unless the user chose Cancel or pressed ESC. Data to display
1105f589320aSDevin Teske# is populated automatically from the system accounting database for the given
1106f589320aSDevin Teske# $user argument with the exception of two environment variables:
1107f589320aSDevin Teske# user_group_delete and user_home_delete. If $defaultitem is present and non-
1108f589320aSDevin Teske# NULL, initially highlight the item in the menu.
1109f589320aSDevin Teske#
1110f589320aSDevin Teskef_dialog_menu_user_delete()
1111f589320aSDevin Teske{
1112f589320aSDevin Teske	local prompt="$msg_delete_exit_or_cancel"
1113f589320aSDevin Teske	local menu_list # Calculated below
1114f589320aSDevin Teske	local defaultitem="$2"
1115f589320aSDevin Teske	local hline="$hline_arrows_tab_enter"
1116ab2043b8SDevin Teske
1117f589320aSDevin Teske	local user_name user_password user_uid user_gid user_class
1118f589320aSDevin Teske	local user_password_expire user_account_expire user_gecos
1119f589320aSDevin Teske	local user_home_dir user_shell user_member_groups
1120f589320aSDevin Teske	f_input_user "$1"
1121ab2043b8SDevin Teske
1122f589320aSDevin Teske	# Attempt to convert numeric UNIX time to calendar date/time
1123f589320aSDevin Teske	local user_account_expires_on=
1124f589320aSDevin Teske	if f_isinteger "$user_account_expire"; then
1125f589320aSDevin Teske		[ "$user_account_expire" -ne 0 ] && user_account_expires_on=$(
1126f589320aSDevin Teske			date -r "$user_account_expire" "+%F %T %Z"
1127f589320aSDevin Teske		)
1128f589320aSDevin Teske	else
1129f589320aSDevin Teske		user_account_expires_on="$user_account_expire"
1130f589320aSDevin Teske	fi
1131f589320aSDevin Teske	local user_password_expires_on=
1132f589320aSDevin Teske	if f_isinteger "$user_password_expire"; then
1133f589320aSDevin Teske		[ $user_password_expire -ne 0 ] && user_password_expires_on=$(
1134f589320aSDevin Teske			date -r "$user_password_expire" "+%F %T %Z"
1135f589320aSDevin Teske		)
1136f589320aSDevin Teske	else
1137f589320aSDevin Teske		user_password_expires_on="$user_password_expire"
1138f589320aSDevin Teske	fi
1139f589320aSDevin Teske
1140f589320aSDevin Teske	# Localize potentially hostile variables and escape their values
1141f589320aSDevin Teske	# to the local variable (see f_shell_escape() of `strings.subr')
1142f589320aSDevin Teske	local var
1143f589320aSDevin Teske	for var in account_expires_on class gecos gid group_delete \
1144f589320aSDevin Teske		home_delete home_dir member_groups name password_expires_on \
1145f589320aSDevin Teske		shell uid \
1146f589320aSDevin Teske	; do
1147f589320aSDevin Teske		local _user_$var
1148f589320aSDevin Teske		eval f_shell_escape \"\$user_$var\" _user_$var
1149f589320aSDevin Teske	done
1150f589320aSDevin Teske
1151*389e4940SDevin Teske	# Attempt to translate a numeric GID into `number (name)'
1152*389e4940SDevin Teske	if f_isinteger "$_user_gid"; then
1153*389e4940SDevin Teske		local _user_group
1154*389e4940SDevin Teske		_user_group=$( pw groupshow -g "$_user_gid" 2> /dev/null ) &&
1155*389e4940SDevin Teske			_user_group="${_user_group%%:*}" &&
1156*389e4940SDevin Teske			f_shell_escape "$_user_gid ($_user_group)" _user_gid
1157*389e4940SDevin Teske	fi
1158*389e4940SDevin Teske
1159f589320aSDevin Teske	menu_list="
1160f589320aSDevin Teske		'X' '$msg_delete/$msg_exit'
1161f589320aSDevin Teske		'1' '$msg_login: $_user_name'
1162f589320aSDevin Teske		'-' '$msg_full_name: $_user_gecos'
1163f589320aSDevin Teske		'-' '$msg_password: -----'
1164f589320aSDevin Teske		'-' '$msg_user_id: $_user_uid'
1165f589320aSDevin Teske		'-' '$msg_group_id: $_user_gid'
1166f589320aSDevin Teske		'-' '$msg_group_members: $_user_member_groups'
1167f589320aSDevin Teske		'-' '$msg_login_class: $_user_class'
1168f589320aSDevin Teske		'-' '$msg_password_expires_on: $_user_password_expires_on'
1169f589320aSDevin Teske		'-' '$msg_account_expires_on: $_user_account_expires_on'
1170f589320aSDevin Teske		'-' '$msg_home_directory: $_user_home_dir'
1171f589320aSDevin Teske		'-' '$msg_shell: $_user_shell'
1172f589320aSDevin Teske	" # END-QUOTE
1173f589320aSDevin Teske	if f_quietly pw groupshow -g "$user_gid"; then menu_list="$menu_list
1174f589320aSDevin Teske		'C' '$msg_delete_primary_group: ${_user_group_delete:-$msg_no}'
1175f589320aSDevin Teske	" # END-QUOTE
1176f589320aSDevin Teske	else menu_list="$menu_list
1177f589320aSDevin Teske		'-' '$msg_delete_primary_group: $msg_n_a'
1178f589320aSDevin Teske	" # END-QUOTE
1179f589320aSDevin Teske	fi
1180f589320aSDevin Teske	case "$user_home_dir" in
1181f589320aSDevin Teske	/|/nonexistent|/var/empty) menu_list="$menu_list
1182f589320aSDevin Teske		'-' '$msg_delete_home_directory: $msg_n_a'
1183f589320aSDevin Teske	   " # END-QUOTE
1184f589320aSDevin Teske	   ;;
1185f589320aSDevin Teske	*) if [ -d "$user_home_dir" ]; then menu_list="$menu_list
1186f589320aSDevin Teske		'D' '$msg_delete_home_directory: ${_user_home_delete:-$msg_no}'
1187f589320aSDevin Teske	   " # END-QUOTE
1188f589320aSDevin Teske	   else menu_list="$menu_list
1189f589320aSDevin Teske		'-' '$msg_delete_home_directory: $msg_n_a'
1190f589320aSDevin Teske	   " # END-QUOTE
1191f589320aSDevin Teske	   fi
1192f589320aSDevin Teske	esac
1193f589320aSDevin Teske
1194f589320aSDevin Teske	local height width rows
1195f589320aSDevin Teske	eval f_dialog_menu_size height width rows \
1196f589320aSDevin Teske	                        \"\$DIALOG_TITLE\"     \
1197f589320aSDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
1198f589320aSDevin Teske	                        \"\$prompt\"           \
1199f589320aSDevin Teske	                        \"\$hline\"            \
1200f589320aSDevin Teske	                        $menu_list
1201f589320aSDevin Teske
1202f589320aSDevin Teske	local menu_choice
1203f589320aSDevin Teske	menu_choice=$( eval $DIALOG \
1204f589320aSDevin Teske		--title \"\$DIALOG_TITLE\"         \
1205f589320aSDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
1206f589320aSDevin Teske		--hline \"\$hline\"                \
1207f589320aSDevin Teske		--ok-label \"\$msg_ok\"            \
1208f589320aSDevin Teske		--cancel-label \"\$msg_cancel\"    \
1209f589320aSDevin Teske		--default-item \"\$defaultitem\"   \
1210f589320aSDevin Teske		--keep-tite                        \
1211f589320aSDevin Teske		--menu \"\$prompt\"                \
1212f589320aSDevin Teske		$height $width $rows               \
1213f589320aSDevin Teske		$menu_list                         \
1214f589320aSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
1215f589320aSDevin Teske	)
1216f589320aSDevin Teske	local retval=$?
1217f589320aSDevin Teske	f_dialog_data_sanitize menu_choice
1218f589320aSDevin Teske	f_dialog_menutag_store "$menu_choice"
1219f589320aSDevin Teske	return $retval
1220f589320aSDevin Teske}
1221f589320aSDevin Teske
1222f589320aSDevin Teske# f_dialog_menu_user_edit [$defaultitem]
1223f589320aSDevin Teske#
1224f589320aSDevin Teske# Present a menu detailing the properties of a login that is about to be
1225f589320aSDevin Teske# modified. The user's menu choice is available using f_dialog_menutag_fetch().
1226f589320aSDevin Teske# Returns success unless the user chose Cancel or pressed ESC. Data to display
1227f589320aSDevin Teske# is taken from environment variables user_account_expire, user_class,
1228f589320aSDevin Teske# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir,
1229f589320aSDevin Teske# user_member_groups, user_name, user_password_expire, user_shell, and
1230f589320aSDevin Teske# user_uid. If $defaultitem is present and non-NULL, initially highlight the
1231f589320aSDevin Teske# item in the menu.
1232f589320aSDevin Teske#
1233f589320aSDevin Teskef_dialog_menu_user_edit()
1234f589320aSDevin Teske{
1235f589320aSDevin Teske	local prompt="$msg_save_exit_or_cancel"
1236f589320aSDevin Teske	local menu_list # Calculated below
1237f589320aSDevin Teske	local defaultitem="$1"
1238f589320aSDevin Teske	local hline="$hline_arrows_tab_enter"
1239f589320aSDevin Teske
1240f589320aSDevin Teske	# Attempt to convert numeric UNIX time to calendar date/time
1241f589320aSDevin Teske	local user_account_expires_on=
1242f589320aSDevin Teske	if f_isinteger "$user_account_expire"; then
1243f589320aSDevin Teske		[ "$user_account_expire" -ne 0 ] && user_account_expires_on=$(
1244f589320aSDevin Teske			date -r "$user_account_expire" "+%F %T %Z"
1245f589320aSDevin Teske		)
1246f589320aSDevin Teske	else
1247f589320aSDevin Teske		user_account_expires_on="$user_account_expire"
1248f589320aSDevin Teske	fi
1249f589320aSDevin Teske	local user_password_expires_on=
1250f589320aSDevin Teske	if f_isinteger "$user_password_expire"; then
1251f589320aSDevin Teske		[ $user_password_expire -ne 0 ] && user_password_expires_on=$(
1252f589320aSDevin Teske			date -r "$user_password_expire" "+%F %T %Z"
1253f589320aSDevin Teske		)
1254f589320aSDevin Teske	else
1255f589320aSDevin Teske		user_password_expires_on="$user_password_expire"
1256f589320aSDevin Teske	fi
1257f589320aSDevin Teske
1258f589320aSDevin Teske	# Localize potentially hostile variables and escape their values
1259f589320aSDevin Teske	# to the local variable (see f_shell_escape() of `strings.subr')
1260f589320aSDevin Teske	local var
1261f589320aSDevin Teske	for var in account_expires_on class dotfiles_create gecos gid \
1262f589320aSDevin Teske		home_create home_dir member_groups name password_expires_on \
1263f589320aSDevin Teske		shell uid \
1264f589320aSDevin Teske	; do
1265f589320aSDevin Teske		local _user_$var
1266f589320aSDevin Teske		eval f_shell_escape \"\$user_$var\" _user_$var
1267f589320aSDevin Teske	done
1268f589320aSDevin Teske
1269*389e4940SDevin Teske	# Attempt to translate a numeric GID into `number (name)'
1270*389e4940SDevin Teske	if f_isinteger "$_user_gid"; then
1271*389e4940SDevin Teske		local _user_group
1272*389e4940SDevin Teske		_user_group=$( pw groupshow -g "$_user_gid" 2> /dev/null ) &&
1273*389e4940SDevin Teske			_user_group="${_user_group%%:*}" &&
1274*389e4940SDevin Teske			f_shell_escape "$_user_gid ($_user_group)" _user_gid
1275*389e4940SDevin Teske	fi
1276*389e4940SDevin Teske
1277f589320aSDevin Teske	menu_list="
1278f589320aSDevin Teske		'X' '$msg_save/$msg_exit'
1279f589320aSDevin Teske		'1' '$msg_login: $_user_name'
1280f589320aSDevin Teske		'2' '$msg_full_name: $_user_gecos'
1281f589320aSDevin Teske		'3' '$msg_password: -----'
1282f589320aSDevin Teske		'4' '$msg_user_id: $_user_uid'
1283f589320aSDevin Teske		'5' '$msg_group_id: $_user_gid'
1284f589320aSDevin Teske		'6' '$msg_member_of_groups: $_user_member_groups'
1285f589320aSDevin Teske		'7' '$msg_login_class: $_user_class'
1286f589320aSDevin Teske		'8' '$msg_password_expires_on: $_user_password_expires_on'
1287f589320aSDevin Teske		'9' '$msg_account_expires_on: $_user_account_expires_on'
1288f589320aSDevin Teske		'A' '$msg_home_directory: $_user_home_dir'
1289f589320aSDevin Teske		'B' '$msg_shell: $_user_shell'
1290f589320aSDevin Teske	" # END-QUOTE
1291f589320aSDevin Teske	case "$user_home_dir" in
1292f589320aSDevin Teske	/|/nonexistent|/var/empty) menu_list="$menu_list
1293f589320aSDevin Teske		'-' '$msg_create_home_directory: $msg_n_a'
1294f589320aSDevin Teske		'-' '$msg_create_dotfiles: $msg_n_a'
1295f589320aSDevin Teske	   " # END-QUOTE
1296f589320aSDevin Teske	   ;;
1297f589320aSDevin Teske	*) if [ -d "$user_home_dir" ]; then menu_list="$menu_list
1298f589320aSDevin Teske		'-' '$msg_create_home_directory: $msg_n_a'
1299f589320aSDevin Teske		'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
1300f589320aSDevin Teske	   " # END-QUOTE
1301f589320aSDevin Teske	   else menu_list="$menu_list
1302f589320aSDevin Teske		'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}'
1303f589320aSDevin Teske		'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
1304f589320aSDevin Teske	   " # END-QUOTE
1305f589320aSDevin Teske	   fi
1306f589320aSDevin Teske	esac
1307f589320aSDevin Teske
1308f589320aSDevin Teske	local height width rows
1309f589320aSDevin Teske	eval f_dialog_menu_size height width rows \
1310f589320aSDevin Teske	                        \"\$DIALOG_TITLE\"     \
1311f589320aSDevin Teske	                        \"\$DIALOG_BACKTITLE\" \
1312f589320aSDevin Teske	                        \"\$prompt\"           \
1313f589320aSDevin Teske	                        \"\$hline\"            \
1314f589320aSDevin Teske	                        $menu_list
1315f589320aSDevin Teske
1316f589320aSDevin Teske	local menu_choice
1317f589320aSDevin Teske	menu_choice=$( eval $DIALOG \
1318f589320aSDevin Teske		--title \"\$DIALOG_TITLE\"         \
1319f589320aSDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
1320f589320aSDevin Teske		--hline \"\$hline\"                \
1321f589320aSDevin Teske		--ok-label \"\$msg_ok\"            \
1322f589320aSDevin Teske		--cancel-label \"\$msg_cancel\"    \
1323f589320aSDevin Teske		--default-item \"\$defaultitem\"   \
1324f589320aSDevin Teske		--keep-tite                        \
1325f589320aSDevin Teske		--menu \"\$prompt\"                \
1326f589320aSDevin Teske		$height $width $rows               \
1327f589320aSDevin Teske		$menu_list                         \
1328f589320aSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
1329f589320aSDevin Teske	)
1330f589320aSDevin Teske	local retval=$?
1331f589320aSDevin Teske	f_dialog_data_sanitize menu_choice
1332f589320aSDevin Teske	f_dialog_menutag_store "$menu_choice"
1333f589320aSDevin Teske	return $retval
1334ab2043b8SDevin Teske}
1335ab2043b8SDevin Teske
133656961fd7SDevin Teske############################################################ MAIN
133756961fd7SDevin Teske
133856961fd7SDevin Teskef_dprintf "%s: Successfully loaded." usermgmt/user_input.subr
133956961fd7SDevin Teske
1340ab2043b8SDevin Teskefi # ! $_USERMGMT_USER_INPUT_SUBR
1341