# Standalone Kerberos test.
# This is a DejaGnu test script.
# This script tests that the Kerberos tools can talk to each other.

# This mostly just calls procedures in testsuite/config/default.exp.

if ![info exists K524INIT] {
    set K524INIT [findfile $objdir/../../krb524/k524init]
}

if ![info exists KRB524D] {
    set KRB524D [findfile $objdir/../../krb524/krb524d]
}

if ![info exists KLIST] {
    set KLIST [findfile $objdir/../../clients/klist/klist]
}

if ![info exists KDESTROY] {
    set KDESTROY [findfile $objdir/../../clients/kdestroy/kdestroy]
}

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

# If we do not have what is for a V4 test - return
if ![v4_compatible_enctype] {
    return
}

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

# A procedure to stop the krb524 daemon.
proc start_k524_daemon { } {
    global KRB524D
    global k524d_spawn_id
    global k524d_pid
    global REALMNAME
    global portbase

    spawn $KRB524D -m -p [expr 7 + $portbase] -r $REALMNAME -nofork
    set k524d_spawn_id $spawn_id
    set k524d_pid [exp_pid]

    # Give the krb524d daemon a few seconds to get set up.
    catch "exec sleep 2"
}

# A procedure to stop the krb524 daemon.
proc stop_k524_daemon { } {
    global k524d_spawn_id
    global k524d_pid

    if [info exists k524d_pid] {
	catch "close -i $k524d_spawn_id"
	catch "exec kill $k524d_pid"
	catch "wait -i $k524d_spawn_id"
	unset k524d_pid
    }
}

# 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 doit { } {
    global env
    global KEY
    global K524INIT
    # To pass spawn_id to the wait process
    global spawn_id
    global KLIST
    global KDESTROY
    global tmppwd
    global REALMNAME
    global des3_krbtgt

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

    # Add a user key and get a V5 ticket
    if {![add_kerberos_key $env(USER) 0] \
	|| ![kinit $env(USER) $env(USER)$KEY 0]} {
	return
    }

    # Start the krb524d daemon.
    start_k524_daemon

    # The k524init program does not advertise anything on success -
    #only failure.
    spawn $K524INIT
    expect {
	-timeout 10 
	-re "k524init: .*\r" {
	    fail "k524init"
	    return
	}
	eof {}
	timeout {}
    }


    if ![check_exit_status "k524init"] {
	return
    }
    pass "k524init"

    # Make sure that klist can see the ticket.
    spawn $KLIST -4
    expect {
	-re "Kerberos 4 ticket cache:\[ 	\]*(.+:)?$tmppwd/tkt.*Principal:\[ 	\]*$env(USER)@$REALMNAME.*krbtgt\.$REALMNAME@$REALMNAME\r\n" {
	    verbose "klist started"
	}
	timeout {
	    fail "v4klist"
	    return
	}
	eof {
	    fail "v4klist"
	    return
	}
    }

    expect {
        "\r" { }
	eof { }
    }

    if ![check_exit_status "klist"] {
	return
    }
    pass "krb524d: v4klist"

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

    pass "krb524d: krb524d"
}

set status [catch doit msg]

stop_kerberos_daemons

stop_k524_daemon

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


