Home | History | Annotate | Download | only in su
      1 #! /usr/bin/expect -f
      2 #*********************************************************************
      3 #   Copyright (c) International Business Machines  Corp., 2003, 2004, 2007
      4 #
      5 #   This program is free software;  you can redistribute it and/or modify
      6 #   it under the terms of the GNU General Public License as published by
      7 #   the Free Software Foundation; either version 2 of the License, or
      8 #   (at your option) any later version.
      9 #
     10 #   This program is distributed in the hope that it will be useful,
     11 #   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13 #   the GNU General Public License for more details.
     14 #
     15 #   You should have received a copy of the GNU General Public License
     16 #   along with this program;  if not, write to the Free Software
     17 #   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18 #
     19 #  FILE   : su
     20 #
     21 #  PURPOSE: Tests the basic functionality of `su`.
     22 #
     23 #  SETUP: The program `/usr/bin/expect' MUST be installed.
     24 #         The user invoking this test script must NOT be "root".
     25 #     	  The PASSWD variable should be set prior to execution
     26 #
     27 #  HISTORY:
     28 #     03/03     Dustin Kirkland (dkirklan (at] us.ibm.com)
     29 #     03/03     Jerone Young    (jeroney (at] us.ibm.com)
     30 #     10/01/04  Kris Wilson     Skip test 7 if RedHat; no -e option.
     31 #     05/23/07  Kris Wilson     Make test 7 work for SLES.
     32 ########################################################################
     33 
     34 # The root user cannot succesfully execute su test because the root user
     35 # is able to become anyone without entering passwords
     36 set whoami [ exec whoami ]
     37 if { $whoami=="root" } {
     38   send_user "ERROR: You must execute the 'su' tests as a non-root user\n"
     39   exit 1
     40 }
     41 
     42 #Grab input from enviroment
     43 if [info exists env(PASSWD)] {
     44   	set PASSWD $env(PASSWD)
     45 } else {
     46 	send_user "YOU NEED TO SET ENVIROMENT VARIABLE PASSWD. \n"
     47 	exit 1
     48 }
     49 
     50 if [info exists env(TEST_USER2)] {
     51   set USER1 $env(TEST_USER2)
     52 } else {
     53   	send_user "YOU MUST SET ENVIRONMENT VARIABLE TEST_USER2"
     54   	exit 1
     55 }
     56 
     57 # Need the release type from su01
     58 if [info exists env(tvar)] {
     59   set distro $env(tvar)
     60 } else {
     61         send_user "YOU MUST SET ENVIORMENT VARIABLE tvar"
     62         exit 1
     63 }
     64 
     65 if [info exists env(TEST_USER2_PASSWD)] {
     66   set USER1_PASSWORD $env(TEST_USER2_PASSWD)
     67 } else {
     68   send_user "YOU MUST SET ENVIROMENT VARIABLE TEST_USER2_PASSWD"
     69   exit 1
     70 }
     71 
     72 if [info exists env(TEST_LINE)] {
     73   set TEST_LINE_ENV $env(TEST_LINE)
     74 } else {
     75   send_user "YOU MUST SET ENVIROMENT VARIABLE TEST_LINE"
     76   exit 1
     77 }
     78 
     79 
     80 if [info exists env(TEST_ENV_FILE)] {
     81   set TEST_ENV_FILE $env(TEST_ENV_FILE)
     82 } else {
     83   send_user "YOU MUST SET ENVIROMENT VARIABLE TEST_ENV_FILE_USER"
     84   exit 1
     85 }
     86 
     87 if [info exists env(TEST_ENV_FILE2)] {
     88   set TEST_ENV_FILE2 $env(TEST_ENV_FILE2)
     89 } else {
     90   send_user "YOU MUST SET ENVIROMENT VARIABLE TEST_ENV_FILE2"
     91   exit 1
     92 }
     93 
     94 
     95 if [info exists env(TEST_ENV_FILE_USER)] {
     96   set TEST_ENV_FILE_USER1 $env(TEST_ENV_FILE_USER)
     97 } else {
     98   send_user "YOU MUST SET ENVIROMENT VARIABLE TEST_ENV_FILE_USER"
     99   exit 1
    100 }
    101 
    102 if [info exists env(TEST_USER1_NEW_PASSWD)] {
    103   set USER1_NEW_PASSWORD $env(TEST_USER1_NEW_PASSWD)
    104 } else {
    105   send_user "YOU MUST SET ENVIROMENT VARIABLE TEST_USER1_NEW_PASSWD"
    106   exit 1
    107 }
    108 
    109 
    110 set script_exit_code 0
    111 set i_can_root 0
    112 
    113 send_user "Starting 'su' Testing\n"
    114 
    115 # 1) su with no parameters and correct password.
    116 #    - The su command should return a result code of 0
    117 #    - The user ID should be root
    118 #    - The user environment should be that of the invoking process
    119 #    - The command should create a new shell with a new process ID
    120 
    121 send_user "\nTEST: su with no parameters and correct password\n"
    122 
    123 set i_am_root 0
    124 # run "whoami" to test user ID inside su shell
    125 spawn /bin/su -c whoami
    126 set i_am_root 0
    127 expect {
    128   "Password:" {
    129   	send "$PASSWD\r"
    130     expect {
    131       "root" { set i_am_root 1
    132 		set i_can_root 1
    133 	 }
    134     }
    135   }
    136 }
    137 
    138 catch close
    139 # capture result code
    140 set codes [wait]
    141 set pid [lindex $codes 0]
    142 set exit_code [lindex $codes 3]
    143 
    144 #Check that su user has same enviroment as current user
    145 set i_have_env 0
    146 set test_env_var " "
    147 if { $i_am_root==1 } {
    148 	spawn su -c "/bin/su root -c \"echo \\\$TEST_LINE > $TEST_ENV_FILE\""
    149 	expect {
    150 		 "Password:" {
    151 			send "$PASSWD\r"
    152 		}
    153 	}
    154 	expect eof
    155 	catch close
    156 	wait
    157 
    158 	set test_env_var [exec cat $TEST_ENV_FILE]
    159 
    160 	if  { $test_env_var==$TEST_LINE_ENV } {
    161 		set i_have_env 1
    162 	} else {
    163 		send_user "/bin/su with correct password (FAILED), the enviroment was not kept after su.\n"
    164 	}
    165 }
    166 
    167 
    168 #this variable is for any test, it can't run correctly if this test fails
    169 set test_one_passed 0
    170 
    171 if { ($i_am_root==1) && ($exit_code==0) && ($pid>0) && ($i_have_env==1) } {
    172 	send_user "/bin/su with correct password & enviroment check ( PASSED )\n"
    173 	set test_one_passed 1
    174 } else {
    175   	send_user "/bin/su with correct password ( FAILED )\n"
    176     set script_exit_code 1
    177 }
    178 
    179 
    180 # 2) su with no parameters and incorrect password.
    181 # 	  - The su command should return a result code of non-0
    182 #     - The user should be returned to the invoking shell
    183 #     - An appropriate failure message should be displayed
    184 
    185 send_user "\nTEST: su with no parameters and incorrect password \n"
    186 
    187 set displayed_error 0
    188 # run "whoami" to test user ID inside su shell
    189 spawn /bin/su -c whoami
    190 set displayed_error 0
    191 expect {
    192   "Password:" {
    193     send "wrong_$PASSWD\r"
    194     expect {
    195 				"su: incorrect password" { set displayed_error 1 }
    196 				"su: Authentication failure" { set displayed_error 1 }
    197     }
    198   }
    199 }
    200 
    201 catch close
    202 # capture result code
    203 set codes [wait]
    204 set pid [lindex $codes 0]
    205 set exit_code [lindex $codes 3]
    206 
    207 #Added for arm architecture
    208 
    209 send_user "\ndisplayed_error=$displayed_error"
    210 send_user "\nexit_code=$exit_code"
    211 send_user "\npid=$pid\n"
    212 
    213 if { ($displayed_error==1) && ($exit_code!=0) && ($pid>0) } {
    214   send_user "/bin/su with incorrect password ( PASSED )\n"
    215 } else {
    216   send_user "/bin/su with incorrect password ( FAILED )\n"
    217   set script_exit_code 1
    218 }
    219 
    220 # 3) su to root using name parameter and correct password.
    221 # - The su command should return a result code of 0
    222 # - The user ID should be root
    223 # - The user environment should be that of the invoking process
    224 # - The command should create a new shell with a new process ID
    225 
    226 send_user "\nTEST: su to root using name parameter and correct password. \n"
    227 
    228 set i_am_root 0
    229 # run "whoami" to test user ID inside su shell
    230 spawn /bin/su -l root -c whoami
    231 expect {
    232   "Password:" {
    233     send "$PASSWD\r"
    234     expect {
    235 				"root" { set i_am_root 1 }
    236     }
    237   }
    238 }
    239 
    240 catch close
    241 # capture result code
    242 set codes [wait]
    243 set pid [lindex $codes 0]
    244 set exit_code [lindex $codes 3]
    245 
    246 
    247 #Check that su user does not have the same enviroment as current user
    248 set i_have_env 0
    249 set test_env " "
    250 if { $i_am_root==1 } {
    251      	spawn /bin/sh -c "/bin/su -l root -c \"echo \"\\\$TEST_LINE > $TEST_ENV_FILE2\"\""
    252         expect {
    253                  "Password:" {
    254 			send "$PASSWD\r"
    255                 }
    256         }
    257 
    258 	set test_env [exec cat $TEST_ENV_FILE2]
    259 
    260 	if  { $test_env==$TEST_LINE_ENV } {
    261         	set i_have_env 1
    262  		send_user "/bin/su -l root with correct password (FAILED), because it did not change enviroment\n"
    263 	}
    264 }
    265 
    266 
    267 if { ($i_am_root==1) && ($exit_code==0) && ($pid>0) && ($i_have_env==0) } {
    268   send_user "/bin/su -l root with correct password & enviroment check ( PASSED )\n"
    269 } else {
    270   send_user "/bin/su -l root with correct password ( FAILED )\n"
    271   set script_exit_code 1
    272 }
    273 
    274 
    275 # 4) su to root with name parameter and incorrect password.
    276 #    - The su command should return a result code of non-0
    277 #    - The user should be returned to the invoking shell
    278 #    - An appropriate failure message should be displayed
    279 
    280 send_user "\nTEST: su to root with name parameter and incorrect password. \n"
    281 
    282 set displayed_error 0
    283 # run "whoami" to test user ID inside su shell
    284 spawn /bin/su -l root -c whoami
    285 expect {
    286   "Password:" {
    287     send "wrong_$PASSWD\r"
    288     expect {
    289 				"su: incorrect password" { set displayed_error 1 }
    290 				"su: Authentication failure" { set displayed_error 1 }
    291     }
    292   }
    293 }
    294 
    295 catch close
    296 # capture result code
    297 set codes [wait]
    298 set pid [lindex $codes 0]
    299 set exit_code [lindex $codes 3]
    300 if { ($displayed_error==1) && ($exit_code!=0) && ($pid>0) } {
    301   send_user "/bin/su -l root with incorrect password ( PASSED )\n"
    302 } else {
    303   send_user "/bin/su -l root with incorrect password ( FAILED )\n"
    304   set script_exit_code 1
    305 }
    306 
    307 
    308 # 5) su to user1 with name parameter and correct password.
    309 #    - The su command should return a result code of 0
    310 #    - The user ID should be user1
    311 #    - The user environment should be that of the invoking process, in this case,that of user1
    312 #    - The command should create a new shell with a new process ID
    313 #    - Run "whoami" to test user ID inside su shell
    314 
    315 send_user "TEST: su to user1 with name parameter and correct password.\n"
    316 
    317 set i_am_correct 0
    318 spawn /bin/su -l $USER1 -c whoami
    319 expect {
    320   "Password:" {
    321     send "$USER1_PASSWORD\r"
    322     expect {
    323 				"$USER1\r" { set i_am_correct 1 }
    324     }
    325   }
    326 }
    327 
    328 catch close
    329 # capture result code
    330 set codes [wait]
    331 set pid [lindex $codes 0]
    332 set exit_code [lindex $codes 3]
    333 
    334 set i_have_env 0
    335 set test_env_var 0
    336 #Check to see that su user does not have the same enviroment
    337 if { $i_am_correct==1 } {
    338         spawn /bin/sh -c "/bin/su -l $USER1 -c \"echo \"\\\$TEST_LINE > $TEST_ENV_FILE_USER1\"\""
    339         expect {
    340                  "Password:" {
    341                                 send "$USER1_PASSWORD\r"
    342                 }
    343         }
    344 
    345 }
    346 
    347 set test_env_var [exec cat $TEST_ENV_FILE_USER1]
    348 
    349 set i_have_env 0
    350 if  { $test_env_var==$TEST_LINE_ENV } {
    351         set i_have_env 1
    352         send_user "/bin/su -l $USER1 with correct password (FAILED), because it did not change enviroment\n"
    353 	set i_have_env 0
    354 	if  { $test_env_var==$TEST_LINE_ENV } {
    355         	set i_have_env 1
    356         	send_user "su -l $USER1 with correct password (FAILED), because it did not change enviroment\n"
    357 	}
    358 }
    359 
    360 if { ($i_am_correct==1) && ($exit_code==0) && ($pid>0) && ($i_have_env==0) } {
    361   send_user "/bin/su -l $USER1 with correct password & enviroment check ( PASSED )\n"
    362 } else {
    363   send_user "/bin/su -l $USER1 with correct password ( FAILED )\n"
    364   set script_exit_code 1
    365 }
    366 
    367 
    368 
    369 # 6)su to user1 with name parameter and incorrect password.
    370 #    - The su command should return a result code of non-0
    371 #    - The user should be returned to the invoking shell
    372 #    - An appropriate failure message should be displayed.
    373 
    374 send_user "TEST: su to user1 with name parameter and incorrect password.\n"
    375 spawn /bin/su -l $USER1 -c whoami
    376 set displayed_error 0
    377 expect {
    378   "Password:" {
    379     send "wrong_$USER1_PASSWORD\r"
    380     expect {
    381 				"su: incorrect password" { set displayed_error 1 }
    382 				"su: Authentication failure" { set displayed_error 1 }
    383     }
    384   }
    385 }
    386 
    387 catch close
    388 # capture result code
    389 set codes [wait]
    390 set pid [lindex $codes 0]
    391 set exit_code [lindex $codes 3]
    392 if { ($displayed_error==1) && ($exit_code!=0) && ($pid>0) } {
    393   	send_user "/bin/su -l $USER1 with incorrect password ( PASSED )\n"
    394 } else {
    395   	send_user "/bin/su -l $USER1 with incorrect password ( FAILED )\n"
    396 	set script_exit_code 1
    397 }
    398 
    399 
    400 # 7) su to user1 with the user1 password expired
    401 #    - user1 should not be allowed to log in
    402 #    - The su command should return a result code of non-0
    403 #    - The user should be returned to the invoking shell
    404 #    - An appropriate failure message should be displayed.
    405 
    406 # Become root and expire $USER1 password
    407 
    408 #  Skip this if Red Hat; -e option not supported.
    409 if { $distro != "redhat" && $distro != "redhat-linux" } {
    410 
    411 if { $test_one_passed==1} {
    412 send_user "TEST:  su to user1 with the user1 password expired.\n"
    413 
    414 spawn /bin/su -l root -c "passwd -e $USER1"
    415 expect {
    416   "Password:" {
    417     send "$PASSWD\r"
    418     expect {
    419 				"Password expiry information changed."
    420     }
    421   }
    422 }
    423 
    424 set i_am_correct 0
    425 spawn /bin/su -l $USER1 -c whoami
    426 expect {
    427   "Password:" {
    428     send "$USER1_PASSWORD\r"
    429     expect {
    430         -re "current.*password|Old Password" {
    431         send "wrong_$USER1_PASSWORD\r"
    432         expect {
    433        	  -re "current.*password|Old Password" {
    434           send "wrong_$USER1_PASSWORD\r"
    435             expect {
    436 								"su: incorrect password" { set i_am_correct 1 }
    437 								"su: Authentication failure" { set i_am_correct 1 }
    438 								"su: Authentication token manipulation error" { set i_am_correct 1 }
    439             }
    440           }
    441 					"su: incorrect password" { set i_am_correct 1 }
    442 					"su: Authentication failure" { set i_am_correct 1 }
    443 					"su: Authentication token manipulation error" { set i_am_correct 1 }
    444         }
    445       }
    446     }
    447   }
    448 }
    449 
    450 catch close
    451 # capture result code
    452 set codes [wait]
    453 set pid [lindex $codes 0]
    454 set exit_code [lindex $codes 3]
    455 if { ($i_am_correct==1) && ($exit_code!=0) && ($pid>0) } {
    456   	send_user "/bin/su -l $USER1 with expired correct password ( PASSED )\n"
    457 } else {
    458   	send_user "/bin/su -l $USER1 with expired correct password ( FAILED )\n"
    459 	set script_exit_code 1
    460 }
    461 
    462 
    463 #Become root and set $USER1 password back to previous value
    464 spawn /bin/su -l root -c "passwd $USER1"
    465 expect {
    466   "Password: " {
    467     send "$PASSWD\r"
    468     expect {
    469      "Enter new password: " {
    470         send "$USER1_NEW_PASSWORD\r"
    471         expect {
    472           "Re-type new password: " {
    473             send "$USER1_NEW_PASSWORD\r"
    474             expect {
    475               "Password changed" {}
    476             }
    477           }
    478         }
    479       }
    480     }
    481   }
    482 }
    483 
    484 catch close
    485 } else {
    486 
    487 	send_user "TEST:  su to user1 with the user1 password expired. (FAILED),see more next line.\n"
    488 	send_user "This test cannot be run because the first test to su as root failed\n"
    489 
    490 }
    491 # If RH let the tester know why only 6 tests were run.
    492 } else {
    493   send_user "TEST 7 skipped if running on Red Hat; -e not supported \n"
    494 }
    495 exit  $script_exit_code
    496