# Password-changing Kerberos test.
# This is a DejaGnu test script.

# We are about to start up a couple of daemon processes.  We do all
# the rest of the tests inside a proc, so that we can easily kill the
# processes when the procedure ends.

proc kinit_expecting_pwchange { name pass newpass } {
    global REALMNAME
    global KINIT
    global spawn_id

    # Use kinit to get a ticket.
	#
	# For now always get forwardable tickets. Later when we need to make
	# tests that distiguish between forwardable tickets and otherwise
	# we should but another option to this proc. --proven
	#
    spawn $KINIT -5 -f $name@$REALMNAME
    expect {
	"Password for $name@$REALMNAME:" {
	    verbose "kinit started"
	}
	timeout {
	    fail "kinit"
	    return 0
	}
	eof {
	    fail "kinit"
	    return 0
	}
    }
    send "$pass\r"
    expect {
	"Enter new password: " { }
	timeout {
	    fail "kinit (new password prompt)"
	    return 0
	}
	eof {
	    fail "kinit (new password prompt)"
	    return 0
	}
    }
    send "$newpass\r"
    expect {
	" again: " { }
	timeout {
	    fail "kinit (new password prompt2)"
	    return 0
	}
	eof {
	    fail "kinit (new password prompt2)"
	    return 0
	}
    }
    send "$newpass\r"
    expect eof
    if ![check_exit_status kinit] {
	return 0
    }

    return 1
}

proc doit { } {
    global REALMNAME
    global KLIST
    global KDESTROY
    global KEY
    global KADMIN_LOCAL
    global KTUTIL
    global hostname
    global tmppwd
    global spawn_id
    global supported_enctypes
    global KRBIV
    global portbase
    global mode

    # Start up the kerberos and kadmind daemons.
    if ![start_kerberos_daemons 0] {
	return
    }

    # Use kadmin to add a key.
    if ![add_kerberos_key pwchanger 0] {
	return
    }

    setup_kerberos_env kdc
    spawn $KADMIN_LOCAL -q "modprinc +needchange pwchanger"
    catch expect_after
    expect {
	timeout {
	    fail "kadmin.local modprinc +needchange"
	}
	eof {
	    pass "kadmin.local modprinc +needchange"
	}
    }
    set k_stat [wait -i $spawn_id]
    verbose "wait -i $spawn_id returned $k_stat (kadmin modprinc +needchange)"
    catch "close -i $spawn_id"

    setup_kerberos_env client
    if ![kinit_expecting_pwchange pwchanger pwchanger$KEY floople] {
	return
    }
    pass "kinit (password change)"
    if ![kinit pwchanger floople 0] {
	return
    }
    pass "kinit (new password)"

    # Destroy the ticket.
    spawn $KDESTROY -5
    if ![check_exit_status "kdestroy"] {
	return
    }
    pass "kdestroy"
}

run_once pwchange {
    # Set up the Kerberos files and environment.
    if {![get_hostname] || ![setup_kerberos_files] || ![setup_kerberos_env]} {
	return
    }

    # Initialize the Kerberos database.  The argument tells
    # setup_kerberos_db that it is being called from here.
    if ![setup_kerberos_db 0] {
	return
    }

    set status [catch doit msg]

    stop_kerberos_daemons

    if { $status != 0 } {
	send_error "ERROR: error in pwchange.exp\n"
	send_error "$msg\n"
	exit 1
    }
}
