1ab2043b8SDevin Teskeif [ ! "$_MUSTBEROOT_SUBR" ]; then _MUSTBEROOT_SUBR=1 2ab2043b8SDevin Teske# 3ab2043b8SDevin Teske# Copyright (c) 2006-2012 Devin Teske 4ab2043b8SDevin Teske# All Rights Reserved. 5ab2043b8SDevin Teske# 6ab2043b8SDevin Teske# Redistribution and use in source and binary forms, with or without 7ab2043b8SDevin Teske# modification, are permitted provided that the following conditions 8ab2043b8SDevin Teske# are met: 9ab2043b8SDevin Teske# 1. Redistributions of source code must retain the above copyright 10ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer. 11ab2043b8SDevin Teske# 2. Redistributions in binary form must reproduce the above copyright 12ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer in the 13ab2043b8SDevin Teske# documentation and/or other materials provided with the distribution. 14ab2043b8SDevin Teske# 15ab2043b8SDevin Teske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16ab2043b8SDevin Teske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE 17ab2043b8SDevin Teske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18ab2043b8SDevin Teske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19ab2043b8SDevin Teske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20ab2043b8SDevin Teske# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21ab2043b8SDevin Teske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22ab2043b8SDevin Teske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23ab2043b8SDevin Teske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24ab2043b8SDevin Teske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25ab2043b8SDevin Teske# SUCH DAMAGE. 26ab2043b8SDevin Teske# 27ab2043b8SDevin Teske# $FreeBSD$ 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..." mustberoot.subr 34ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr 35ab2043b8SDevin Teske 36ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" 37ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/include/messages.subr 38ab2043b8SDevin Teske 39ab2043b8SDevin Teske############################################################ CONFIGURATION 40ab2043b8SDevin Teske# NOTE: These are not able to be overridden/inherited for security purposes. 41ab2043b8SDevin Teske 42ab2043b8SDevin Teske# 43ab2043b8SDevin Teske# Number of tries a user gets to enter his/her password before we log the 44ab2043b8SDevin Teske# sudo(8) failure and exit. 45ab2043b8SDevin Teske# 46ab2043b8SDevin TeskePASSWD_TRIES=3 47ab2043b8SDevin Teske 48ab2043b8SDevin Teske# 49ab2043b8SDevin Teske# While in SECURE mode, should authentication as `root' be allowed? Set to 50ab2043b8SDevin Teske# non-NULL to enable authentication as `root', otherwise disabled. 51ab2043b8SDevin Teske# 52ab2043b8SDevin Teske# WARNING: 53ab2043b8SDevin Teske# Unless using a custom sudo(8) configuration, user `root' should not be 54ab2043b8SDevin Teske# allowed because no password is required to become `root' when already `root' 55ab2043b8SDevin Teske# and therefore, any value entered as password will work. 56ab2043b8SDevin Teske# 57ab2043b8SDevin TeskeSECURE_ALLOW_ROOT= 58ab2043b8SDevin Teske 59ab2043b8SDevin Teske# 60ab2043b8SDevin Teske# While in SECURE mode, should we divulge (through error message) when the 61ab2043b8SDevin Teske# requested authentication user does not exist? Set to non-NULL to enable, 62ab2043b8SDevin Teske# otherwise a non-existent user is treated like an invalid password. 63ab2043b8SDevin Teske# 64ab2043b8SDevin TeskeSECURE_DIVULGE_UNKNOWN_USER= 65ab2043b8SDevin Teske 66ab2043b8SDevin Teske############################################################ FUNCTIONS 67ab2043b8SDevin Teske 68ab2043b8SDevin Teske# f_become_root_via_sudo 69ab2043b8SDevin Teske# 70ab2043b8SDevin Teske# If not running as root, prompt for sudo(8) credentials to become root. 71ab2043b8SDevin Teske# Re-execution of the current program via sudo is automatically handled. 72ab2043b8SDevin Teske# 73ab2043b8SDevin Teske# The following environment variables effect functionality: 74ab2043b8SDevin Teske# 75ab2043b8SDevin Teske# USE_XDIALOG Either NULL or Non-NULL. If given a value will indicate 76ab2043b8SDevin Teske# that Xdialog(1) should be used instead of dialog(1). 77ab2043b8SDevin Teske# 78ab2043b8SDevin Teskef_become_root_via_sudo() 79ab2043b8SDevin Teske{ 80ab2043b8SDevin Teske local msg hline size 81ab2043b8SDevin Teske 82ab2043b8SDevin Teske [ "$( id -u )" = "0" ] && return $SUCCESS 83ab2043b8SDevin Teske 84ab2043b8SDevin Teske f_have sudo || f_die 1 "$msg_must_be_root_to_execute" "$pgm" 85ab2043b8SDevin Teske 86ab2043b8SDevin Teske # 879da4528eSDevin Teske # Ask the user if it's OK to become root via sudo(8) and give them 889da4528eSDevin Teske # the option to save this preference (by touch(1)ing a file in the 899da4528eSDevin Teske # user's $HOME directory). 909da4528eSDevin Teske # 919da4528eSDevin Teske local checkpath="${HOME%/}/.bsdconfig_uses_sudo" 929da4528eSDevin Teske if [ ! -e "$checkpath" ]; then 939da4528eSDevin Teske msg=$( printf "$msg_always_try_sudo_when_run_as" "$USER" ) 949da4528eSDevin Teske local menu_list=" 959da4528eSDevin Teske 'X' '$msg_cancel_exit' 969da4528eSDevin Teske '1' '$msg' 979da4528eSDevin Teske '2' '$msg_try_sudo_only_this_once' 989da4528eSDevin Teske " # END-QUOTE 999da4528eSDevin Teske msg=$( printf "$msg_you_are_not_root_but" bsdconfig ) 1009da4528eSDevin Teske hline="$hline_arrows_tab_enter" 1019da4528eSDevin Teske size=$( eval f_dialog_menu_size \ 1029da4528eSDevin Teske \"\$DIALOG_TITLE\" \ 1039da4528eSDevin Teske \"\$DIALOG_BACKTITLE\" \ 1049da4528eSDevin Teske \"\$msg\" \ 1059da4528eSDevin Teske \"\$hline\" \ 1069da4528eSDevin Teske $menu_list ) 1079da4528eSDevin Teske 1089da4528eSDevin Teske local dialog_menu mtag retval 1099da4528eSDevin Teske dialog_menu=$( eval $DIALOG \ 1109da4528eSDevin Teske --title \"\$DIALOG_TITLE\" \ 1119da4528eSDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 1129da4528eSDevin Teske --hline \"\$hline\" \ 1139da4528eSDevin Teske --ok-label \"\$msg_ok\" \ 1149da4528eSDevin Teske --cancel-label \"\$msg_cancel\" \ 1159da4528eSDevin Teske --menu \"\$msg\" $size \ 1169da4528eSDevin Teske $menu_list \ 1179da4528eSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 1189da4528eSDevin Teske ) 1199da4528eSDevin Teske retval=$? 1209da4528eSDevin Teske setvar DIALOG_MENU_$$ "$dialog_menu" 1219da4528eSDevin Teske mtag=$( f_dialog_menutag ) 1229da4528eSDevin Teske 1239da4528eSDevin Teske [ $retval -eq 0 ] || f_die 1249da4528eSDevin Teske 1259da4528eSDevin Teske case "$mtag" in 1269da4528eSDevin Teske X) # Cancel/Exit 1279da4528eSDevin Teske f_die ;; 1289da4528eSDevin Teske 1) # Always try sudo(8) when run as $user 1299da4528eSDevin Teske local err 1309da4528eSDevin Teske if ! err=$( touch "$checkpath" 2>&1 ); then 131*db7b0ba7SDevin Teske f_dialog_msgbox "$err" 1329da4528eSDevin Teske else 1339da4528eSDevin Teske f_show_msg "$msg_created_path" "$checkpath" 1349da4528eSDevin Teske fi 1359da4528eSDevin Teske esac 1369da4528eSDevin Teske else 1379da4528eSDevin Teske # 1389da4528eSDevin Teske # This user has created the path signing-off on sudo(8)-use 1399da4528eSDevin Teske # but let's still give them a short/quick/unobtrusive reminder 1409da4528eSDevin Teske # 1419da4528eSDevin Teske f_dialog_info "$msg_becoming_root_via_sudo" 1429da4528eSDevin Teske [ "$USE_XDIALOG" ] || sleep 0.6 1439da4528eSDevin Teske fi 1449da4528eSDevin Teske 1459da4528eSDevin Teske # 146ab2043b8SDevin Teske # Check sudo(8) access before prompting for password. 147ab2043b8SDevin Teske # 148fb7d723eSDevin Teske :| sudo -S -v 2> /dev/null 149ab2043b8SDevin Teske if [ $? -ne $SUCCESS ]; then 150ab2043b8SDevin Teske # 151ab2043b8SDevin Teske # sudo(8) access denied. Prompt for their password. 152ab2043b8SDevin Teske # 153ab2043b8SDevin Teske msg="$msg_please_enter_password" 154ab2043b8SDevin Teske hline="$hline_alnum_punc_tab_enter" 155ab2043b8SDevin Teske size=$( f_dialog_inputbox_size \ 156ab2043b8SDevin Teske "$DIALOG_TITLE" \ 157ab2043b8SDevin Teske "$DIALOG_BACKTITLE" \ 158ab2043b8SDevin Teske "$msg" \ 159ab2043b8SDevin Teske "$hline" ) 160ab2043b8SDevin Teske 161ab2043b8SDevin Teske # 162ab2043b8SDevin Teske # Continue prompting until they either Cancel, succeed 163ab2043b8SDevin Teske # or exceed the number of allowed failures. 164ab2043b8SDevin Teske # 165ab2043b8SDevin Teske local password nfailures=0 retval 166ab2043b8SDevin Teske while [ $nfailures -lt $PASSWD_TRIES ]; do 167ab2043b8SDevin Teske if [ "$USE_XDIALOG" ]; then 168ab2043b8SDevin Teske password=$( $DIALOG \ 169ab2043b8SDevin Teske --title "$DIALOG_TITLE" \ 170ab2043b8SDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 171ab2043b8SDevin Teske --hline "$hline" \ 172ab2043b8SDevin Teske --ok-label "$msg_ok" \ 173ab2043b8SDevin Teske --cancel-label "$msg_cancel" \ 174ab2043b8SDevin Teske --password --inputbox "$msg" $size \ 175fb7d723eSDevin Teske 2>&1 > /dev/null ) 176ab2043b8SDevin Teske retval=$? 177ab2043b8SDevin Teske 178ab2043b8SDevin Teske # Catch X11-related errors 179ab2043b8SDevin Teske [ $retval -eq 255 ] && 180ab2043b8SDevin Teske f_die $retval "$password" 181ab2043b8SDevin Teske else 18289498fdfSDevin Teske local dialog_inputbox 18389498fdfSDevin Teske dialog_inputbox=$( $DIALOG \ 184ab2043b8SDevin Teske --title "$DIALOG_TITLE" \ 185ab2043b8SDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 186ab2043b8SDevin Teske --hline "$hline" \ 187ab2043b8SDevin Teske --ok-label "$msg_ok" \ 188ab2043b8SDevin Teske --cancel-label "$msg_cancel" \ 189ab2043b8SDevin Teske --insecure \ 190ab2043b8SDevin Teske --passwordbox "$msg" $size \ 19189498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 19289498fdfSDevin Teske ) 193ab2043b8SDevin Teske retval=$? 19489498fdfSDevin Teske setvar DIALOG_INPUTBOX_$$ "$dialog_inputbox" 195ab2043b8SDevin Teske password=$( f_dialog_inputstr ) 196ab2043b8SDevin Teske fi 197ab2043b8SDevin Teske 198ab2043b8SDevin Teske # Exit if the user cancelled. 199ab2043b8SDevin Teske [ $retval -eq $SUCCESS ] || exit $retval 200ab2043b8SDevin Teske 201ab2043b8SDevin Teske # 202ab2043b8SDevin Teske # Validate sudo(8) credentials 203ab2043b8SDevin Teske # 204fb7d723eSDevin Teske sudo -S -v 2> /dev/null <<-EOF 205ab2043b8SDevin Teske $password 206ab2043b8SDevin Teske EOF 207ab2043b8SDevin Teske retval=$? 208ab2043b8SDevin Teske unset password # scrub memory 209ab2043b8SDevin Teske if [ $retval -eq $SUCCESS ]; then 210ab2043b8SDevin Teske # Access granted... 211ab2043b8SDevin Teske break 212ab2043b8SDevin Teske else 213ab2043b8SDevin Teske # Access denied... 214ab2043b8SDevin Teske nfailures=$(( $nfailures + 1 )) 215ab2043b8SDevin Teske 216ab2043b8SDevin Teske # introduce a short delay 217ab2043b8SDevin Teske if [ $nfailures -lt $PASSWD_TRIES ]; then 218ab2043b8SDevin Teske f_dialog_info "$msg_sorry_try_again" 219ab2043b8SDevin Teske sleep 1 220ab2043b8SDevin Teske fi 221ab2043b8SDevin Teske fi 222ab2043b8SDevin Teske done 223ab2043b8SDevin Teske 224ab2043b8SDevin Teske # 225ab2043b8SDevin Teske # If user exhausted number of allowed password tries, log 226ab2043b8SDevin Teske # the security event and exit immediately. 227ab2043b8SDevin Teske # 228ab2043b8SDevin Teske if [ $nfailures -ge $PASSWD_TRIES ]; then 229ab2043b8SDevin Teske msg=$( printf "$msg_nfailed_attempts" "$nfailures" ) 230ab2043b8SDevin Teske logger -p auth.notice -t sudo " " \ 231ab2043b8SDevin Teske "$USER : $msg" \ 232ab2043b8SDevin Teske "; TTY=$(tty)" \ 233ab2043b8SDevin Teske "; PWD=$PWD" \ 234ab2043b8SDevin Teske "; USER=root" \ 235ab2043b8SDevin Teske "; COMMAND=$0" 236ab2043b8SDevin Teske f_die 1 "sudo: $msg" 237ab2043b8SDevin Teske fi 238ab2043b8SDevin Teske fi 239ab2043b8SDevin Teske 240ab2043b8SDevin Teske # Use xauth(1) to grant root the ability to use this X11/SSH session 241ab2043b8SDevin Teske if [ "$USE_XDIALOG" -a "$SSH_CONNECTION" -a "$DISPLAY" ]; then 242ab2043b8SDevin Teske f_have xauth || f_die 1 \ 243ab2043b8SDevin Teske "$msg_no_such_file_or_directory" "$pgm" "xauth" 244ab2043b8SDevin Teske local HOSTNAME displaynum 245ab2043b8SDevin Teske HOSTNAME=$(hostname) 246ab2043b8SDevin Teske displaynum="${DISPLAY#*:}" 247ab2043b8SDevin Teske xauth -f ~/.Xauthority extract - $HOSTNAME/unix:$displaynum \ 248ab2043b8SDevin Teske $HOSTNAME:$displaynum | sudo sh -c 'xauth -ivf \ 249fb7d723eSDevin Teske ~root/.Xauthority merge - > /dev/null 2>&1' 250ab2043b8SDevin Teske fi 251ab2043b8SDevin Teske 252ab2043b8SDevin Teske # Re-execute ourselves with sudo(8) 253ab2043b8SDevin Teske if [ $ARGC -gt 0 ]; then 254ab2043b8SDevin Teske exec sudo "$0" $ARGV 255ab2043b8SDevin Teske else 256ab2043b8SDevin Teske exec sudo "$0" 257ab2043b8SDevin Teske fi 258ab2043b8SDevin Teske exit $? # Never reached unless error 259ab2043b8SDevin Teske} 260ab2043b8SDevin Teske 261ab2043b8SDevin Teske# f_authenticate_some_user 262ab2043b8SDevin Teske# 263ab2043b8SDevin Teske# Only used if running as root and requires X11 (see USE_XDIALOG below). 264ab2043b8SDevin Teske# Prompts the user to enter a username and password to be authenticated via 265ab2043b8SDevin Teske# sudo(8) to proceed. 266ab2043b8SDevin Teske# 267ab2043b8SDevin Teske# The following environment variables effect functionality: 268ab2043b8SDevin Teske# 269ab2043b8SDevin Teske# USE_XDIALOG Either NULL or Non-NULL. If given a value will indicate 270ab2043b8SDevin Teske# that Xdialog(1) should be used instead of dialog(1). 271ab2043b8SDevin Teske# 272ab2043b8SDevin Teskef_authenticate_some_user() 273ab2043b8SDevin Teske{ 274ab2043b8SDevin Teske local msg hline size width height 275ab2043b8SDevin Teske 276ab2043b8SDevin Teske f_have sudo || f_die 1 "$msg_must_be_root_to_execute" "$pgm" 277ab2043b8SDevin Teske 278ab2043b8SDevin Teske # 279ab2043b8SDevin Teske # Secure-mode has been requested. 280ab2043b8SDevin Teske # 281ab2043b8SDevin Teske 282ab2043b8SDevin Teske [ "$USE_XDIALOG" ] || f_die 1 "$msg_secure_mode_requires_x11" 283ab2043b8SDevin Teske [ "$(id -u)" = "0" ] || f_die 1 "$msg_secure_mode_requires_root" 284ab2043b8SDevin Teske 285ab2043b8SDevin Teske # 286ab2043b8SDevin Teske # Prompt for sudo(8) credentials. 287ab2043b8SDevin Teske # 288ab2043b8SDevin Teske 289ab2043b8SDevin Teske msg="$msg_please_enter_username_password" 290ab2043b8SDevin Teske hline="$hline_alnum_punc_tab_enter" 291ab2043b8SDevin Teske size=$( f_xdialog_2inputsbox_size \ 292ab2043b8SDevin Teske "$DIALOG_TITLE" \ 293ab2043b8SDevin Teske "$DIALOG_BACKTITLE" \ 294ab2043b8SDevin Teske "$msg" \ 295ab2043b8SDevin Teske "$field_username" "" \ 296ab2043b8SDevin Teske "$field_password" "" ) 297ab2043b8SDevin Teske width="${size##*[$IFS]}" 298ab2043b8SDevin Teske height="${size%%[$IFS]*}" 299ab2043b8SDevin Teske height=$(( $height + 2 )) # Add height for --password 300ab2043b8SDevin Teske 301ab2043b8SDevin Teske # 302ab2043b8SDevin Teske # Continue prompting until they either Cancel, succeed or exceed the 303ab2043b8SDevin Teske # number of allowed failures. 304ab2043b8SDevin Teske # 305ab2043b8SDevin Teske local user_pass nfailures=0 retval 306ab2043b8SDevin Teske while [ $nfailures -lt $PASSWD_TRIES ]; do 307ab2043b8SDevin Teske user_pass=$( $DIALOG \ 308ab2043b8SDevin Teske --title "$DIALOG_TITLE" \ 309ab2043b8SDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 310ab2043b8SDevin Teske --hline "$hline" \ 311ab2043b8SDevin Teske --ok-label "$msg_ok" \ 312ab2043b8SDevin Teske --cancel-label "$msg_cancel" \ 313ab2043b8SDevin Teske --password --2inputsbox "$msg" \ 314ab2043b8SDevin Teske $height $width \ 315ab2043b8SDevin Teske "$field_username" "" \ 316ab2043b8SDevin Teske "$field_password" "" \ 317fb7d723eSDevin Teske 2>&1 > /dev/null ) 318ab2043b8SDevin Teske retval=$? 319ab2043b8SDevin Teske 320ab2043b8SDevin Teske # Catch X11-related errors 321ab2043b8SDevin Teske [ $retval -eq 255 ] && f_die $retval "$user_pass" 322ab2043b8SDevin Teske 323ab2043b8SDevin Teske # Exit if the user cancelled. 324ab2043b8SDevin Teske [ $retval -eq $SUCCESS ] || exit $retval 325ab2043b8SDevin Teske 326ab2043b8SDevin Teske # 327ab2043b8SDevin Teske # Make sure the user exists and is non-root 328ab2043b8SDevin Teske # 329ab2043b8SDevin Teske local user password 330ab2043b8SDevin Teske user="${user_pass%%/*}" 331ab2043b8SDevin Teske password="${user_pass#*/}" 332ab2043b8SDevin Teske unset user_pass # scrub memory 333ab2043b8SDevin Teske if [ ! "$user" ]; then 334ab2043b8SDevin Teske nfailures=$(( $nfailures + 1 )) 335ab2043b8SDevin Teske f_dialog_msgbox "$msg_no_username" 336ab2043b8SDevin Teske continue 337ab2043b8SDevin Teske fi 338ab2043b8SDevin Teske if [ ! "$SECURE_ALLOW_ROOT" ]; then 339ab2043b8SDevin Teske case "$user" in 340ab2043b8SDevin Teske root|toor) 341ab2043b8SDevin Teske nfailures=$(( $nfailures + 1 )) 342fa2e39c8SDevin Teske f_show_msg "$msg_user_disallowed" "$user" 343ab2043b8SDevin Teske continue 344ab2043b8SDevin Teske esac 345ab2043b8SDevin Teske fi 346ab2043b8SDevin Teske if ! f_quietly id "$user"; then 347ab2043b8SDevin Teske nfailures=$(( $nfailures + 1 )) 348ab2043b8SDevin Teske if [ "$SECURE_DIVULGE_UNKNOWN_USER" ]; then 349fa2e39c8SDevin Teske f_show_msg "$msg_unknown_user" "$user" 350ab2043b8SDevin Teske elif [ $nfailures -lt $PASSWD_TRIES ]; then 351ab2043b8SDevin Teske f_dialog_info "$msg_sorry_try_again" 352ab2043b8SDevin Teske sleep 1 353ab2043b8SDevin Teske fi 354ab2043b8SDevin Teske continue 355ab2043b8SDevin Teske fi 356ab2043b8SDevin Teske 357ab2043b8SDevin Teske # 358ab2043b8SDevin Teske # Validate sudo(8) credentials for given user 359ab2043b8SDevin Teske # 360ab2043b8SDevin Teske su -m "$user" <<-EOF 361ab2043b8SDevin Teske sh <<EOS 362ab2043b8SDevin Teske sudo -k 363fb7d723eSDevin Teske sudo -S -v 2> /dev/null <<EOP 364ab2043b8SDevin Teske $password 365ab2043b8SDevin Teske EOP 366ab2043b8SDevin Teske EOS 367ab2043b8SDevin Teske EOF 368ab2043b8SDevin Teske retval=$? 369ab2043b8SDevin Teske unset user 370ab2043b8SDevin Teske unset password # scrub memory 371ab2043b8SDevin Teske 372ab2043b8SDevin Teske if [ $retval -eq $SUCCESS ]; then 373ab2043b8SDevin Teske # Access granted... 374ab2043b8SDevin Teske break 375ab2043b8SDevin Teske else 376ab2043b8SDevin Teske # Access denied... 377ab2043b8SDevin Teske nfailures=$(( $nfailures + 1 )) 378ab2043b8SDevin Teske 379ab2043b8SDevin Teske # introduce a short delay 380ab2043b8SDevin Teske if [ $nfailures -lt $PASSWD_TRIES ]; then 381ab2043b8SDevin Teske f_dialog_info "$msg_sorry_try_again" 382ab2043b8SDevin Teske sleep 1 383ab2043b8SDevin Teske fi 384ab2043b8SDevin Teske fi 385ab2043b8SDevin Teske done 386ab2043b8SDevin Teske 387ab2043b8SDevin Teske # 388ab2043b8SDevin Teske # If user exhausted number of allowed password tries, log 389ab2043b8SDevin Teske # the security event and exit immediately. 390ab2043b8SDevin Teske # 391ab2043b8SDevin Teske if [ $nfailures -ge $PASSWD_TRIES ]; then 392ab2043b8SDevin Teske msg=$( printf "$msg_nfailed_attempts" "$nfailures" ) 393ab2043b8SDevin Teske logger -p auth.notice -t sudo " " \ 394ab2043b8SDevin Teske "${SUDO_USER:-$USER} : $msg" \ 395ab2043b8SDevin Teske "; TTY=$(tty)" \ 396ab2043b8SDevin Teske "; PWD=$PWD" \ 397ab2043b8SDevin Teske "; USER=root" \ 398ab2043b8SDevin Teske "; COMMAND=$0" 399ab2043b8SDevin Teske f_die 1 "sudo: $message" 400ab2043b8SDevin Teske fi 401ab2043b8SDevin Teske} 402ab2043b8SDevin Teske 403ab2043b8SDevin Teske# f_mustberoot_init 404ab2043b8SDevin Teske# 405ab2043b8SDevin Teske# If not already root, make the switch to root by re-executing ourselves via 406ab2043b8SDevin Teske# sudo(8) using user-supplied credentials. 407ab2043b8SDevin Teske# 408ab2043b8SDevin Teske# The following environment variables effect functionality: 409ab2043b8SDevin Teske# 410ab2043b8SDevin Teske# SECURE Either NULL or Non-NULL. If given a value will indicate 411ab2043b8SDevin Teske# that (while running as root) sudo(8) authentication is 412ab2043b8SDevin Teske# required to proceed. 413ab2043b8SDevin Teske# 414ab2043b8SDevin Teskef_mustberoot_init() 415ab2043b8SDevin Teske{ 416ab2043b8SDevin Teske if [ "$(id -u)" != "0" -a ! "$SECURE" ]; then 417ab2043b8SDevin Teske f_become_root_via_sudo 418ab2043b8SDevin Teske elif [ "$SECURE" ]; then 419ab2043b8SDevin Teske f_authenticate_some_user 420ab2043b8SDevin Teske fi 421ab2043b8SDevin Teske} 422ab2043b8SDevin Teske 42356961fd7SDevin Teske############################################################ MAIN 42456961fd7SDevin Teske 42556961fd7SDevin Teskef_dprintf "%s: Successfully loaded." mustberoot.subr 42656961fd7SDevin Teske 427ab2043b8SDevin Teskefi # ! $_MUSTBEROOT_SUBR 428