xref: /freebsd/usr.sbin/bsdconfig/password/share/password.subr (revision db7b0ba78fea6ccdf0a708c73923ad24c009a58c)
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$
28#
29############################################################ INCLUDES
30
31BSDCFG_SHARE="/usr/share/bsdconfig"
32. $BSDCFG_SHARE/common.subr || exit 1
33f_dprintf "%s: loading includes..." password/password.subr
34f_include $BSDCFG_SHARE/dialog.subr
35
36BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="040.password"
37f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
38
39############################################################ FUNCTIONS
40
41# f_dialog_input_password
42#
43# Prompt the user to enter a password (twice). If the user does not cancel or
44# press ESC, the $pw_password environment variable will hold the password.
45#
46f_dialog_input_password()
47{
48	local hline="$hline_alnum_punc_tab_enter"
49	local msg size rmsg rsize
50
51	msg=$( printf "$msg_password" )
52	size=$( f_dialog_inputbox_size \
53	        	"$DIALOG_TITLE"     \
54	        	"$DIALOG_BACKTITLE" \
55	        	"$msg"              \
56	        	""                  \
57	        	"$hline"            )
58
59	rmsg=$( printf "$msg_reenter_password" )
60	rsize=$( f_dialog_inputbox_size \
61	        	"$DIALOG_TITLE"     \
62	        	"$DIALOG_BACKTITLE" \
63	        	"$rmsg"             \
64	        	""                  \
65	        	"$hline"            )
66
67	#
68	# Loop until the user provides taint-free/valid input
69	#
70	local retval _password1 _password2
71	while :; do
72		local dialog_inputbox
73		dialog_inputbox=$( eval $DIALOG \
74			--title \"\$DIALOG_TITLE\"         \
75			--backtitle \"\$DIALOG_BACKTITLE\" \
76			--hline \"\$hline\"                \
77			--ok-label \"\$msg_ok\"            \
78			--cancel-label \"\$msg_cancel\"    \
79			--insecure                         \
80			--passwordbox \"\$msg\" $size      \
81			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
82		)
83
84		retval=$?
85		setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox"
86		_password1=$( f_dialog_inputstr )
87
88		# Return if user has either pressed ESC or chosen Cancel/No
89		[ $retval -eq $SUCCESS ] || return $retval
90
91		dialog_inputbox=$( eval $DIALOG \
92			--title \"\$DIALOG_TITLE\"         \
93			--backtitle \"\$DIALOG_BACKTITLE\" \
94			--hline \"\$hline\"                \
95			--ok-label \"\$msg_ok\"            \
96			--cancel-label \"\$msg_cancel\"    \
97			--insecure                         \
98			--passwordbox \"\$rmsg\" $rsize    \
99			2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
100		)
101
102		retval=$?
103		setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox"
104		_password2=$( f_dialog_inputstr )
105
106		# Return if user has either pressed ESC or chosen Cancel/No
107		[ $retval -eq $SUCCESS ] || return $retval
108
109		# Check for NULL entry
110		if ! [ "$_password1" -o "$_password2" ]; then
111			f_dialog_msgbox "$msg_password_is_empty"
112			continue
113		fi
114
115		# Check for password mismatch
116		if [ "$_password1" != "$_password2" ]; then
117			f_dialog_msgbox "$msg_passwords_do_not_match"
118			continue
119		fi
120
121		pw_password="$_password1"
122		break
123	done
124
125	return $SUCCESS
126}
127
128############################################################ MAIN
129
130f_dprintf "%s: Successfully loaded." password/password.subr
131
132fi # ! $_PASSWORD_PASSWORD_SUBR
133