password.subr revision 240768
1if [ ! "$_PASSWORD_PASSWORD_SUBR" ]; then _PASSWORD_PASSWORD_SUBR=1
2#
3# Copyright (c) 2012 Devin Teske
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27# $FreeBSD: head/usr.sbin/bsdconfig/password/share/password.subr 240768 2012-09-20 23:44:13Z dteske $
28#
29############################################################ INCLUDES
30
31BSDCFG_SHARE="/usr/share/bsdconfig"
32. $BSDCFG_SHARE/common.subr || exit 1
33f_include $BSDCFG_SHARE/dialog.subr
34
35BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="040.password"
36f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
37
38############################################################ FUNCTIONS
39
40# f_dialog_input_password
41#
42# Prompt the user to enter a password (twice). If the user does not cancel or
43# press ESC, the $pw_password environment variable will hold the password.
44#
45f_dialog_input_password()
46{
47	local hline="$hline_alnum_punc_tab_enter"
48	local msg size rmsg rsize
49
50	msg=$( printf "$msg_password" )
51	size=$( f_dialog_inputbox_size \
52	        	"$DIALOG_TITLE"     \
53	        	"$DIALOG_BACKTITLE" \
54	        	"$msg"              \
55	        	""                  \
56	        	"$hline"            )
57
58	rmsg=$( printf "$msg_reenter_password" )
59	rsize=$( f_dialog_inputbox_size \
60	        	"$DIALOG_TITLE"     \
61	        	"$DIALOG_BACKTITLE" \
62	        	"$rmsg"             \
63	        	""                  \
64	        	"$hline"            )
65
66	#
67	# Loop until the user provides taint-free/valid input
68	#
69	local retval _password1 _password2
70	while :; do
71		local dialog_inputbox
72		dialog_inputbox=$( eval $DIALOG \
73			--title \"\$DIALOG_TITLE\"         \
74			--backtitle \"\$DIALOG_BACKTITLE\" \
75			--hline \"\$hline\"                \
76			--ok-label \"\$msg_ok\"            \
77			--cancel-label \"\$msg_cancel\"    \
78			--insecure                         \
79			--passwordbox \"\$msg\" $size      \
80			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
81		)
82
83		retval=$?
84		setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox"
85		_password1=$( f_dialog_inputstr )
86
87		# Return if user has either pressed ESC or chosen Cancel/No
88		[ $retval -eq $SUCCESS ] || return $retval
89
90		dialog_inputbox=$( eval $DIALOG \
91			--title \"\$DIALOG_TITLE\"         \
92			--backtitle \"\$DIALOG_BACKTITLE\" \
93			--hline \"\$hline\"                \
94			--ok-label \"\$msg_ok\"            \
95			--cancel-label \"\$msg_cancel\"    \
96			--insecure                         \
97			--passwordbox \"\$rmsg\" $rsize    \
98			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
99		)
100
101		retval=$?
102		setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox"
103		_password2=$( f_dialog_inputstr )
104
105		# Return if user has either pressed ESC or chosen Cancel/No
106		[ $retval -eq $SUCCESS ] || return $retval
107
108		# Check for NULL entry
109		if ! [ "$_password1" -o "$_password2" ]; then
110			f_show_msg "$msg_password_is_empty"
111			continue
112		fi
113
114		# Check for password mismatch
115		if [ "$_password1" != "$_password2" ]; then
116			f_show_msg "$msg_passwords_do_not_match"
117			continue
118		fi
119
120		pw_password="$_password1"
121		break
122	done
123
124	return $SUCCESS
125}
126
127fi # ! $_PASSWORD_PASSWORD_SUBR
128