Imported Upstream version 1.15.1
[platform/upstream/krb5.git] / src / tests / dejagnu / krb-standalone / standalone.exp
1 # Standalone Kerberos test.
2 # This is a DejaGnu test script.
3 # This script tests that the Kerberos tools can talk to each other.
4
5 # This mostly just calls procedures in testsuite/config/default.exp.
6
7 # Set up the Kerberos files and environment.
8 if {![get_hostname] || ![setup_kerberos_files] || ![setup_kerberos_env]} {
9     return
10 }
11
12 # Initialize the Kerberos database.  The argument tells
13 # setup_kerberos_db that it is being called from here.
14 if ![setup_kerberos_db 1] {
15     return
16 }
17
18 # We are about to start up a couple of daemon processes.  We do all
19 # the rest of the tests inside a proc, so that we can easily kill the
20 # processes when the procedure ends.
21
22 proc dump_and_reload {} {
23     global KDB5_UTIL
24     global tmppwd
25
26     set dumpfile $tmppwd/dump-file
27     set dumpokfile $dumpfile.dump_ok
28
29     set test1name "kdb5_util dump"
30     set test2name "kdb5_util load"
31
32     if [file exists $dumpfile] { file delete $dumpfile }
33     if [file exists $dumpokfile] { file delete $dumpokfile }
34
35     spawn $KDB5_UTIL dump $dumpfile
36     expect {
37         -re "..*" {
38             fail $test1name
39             untested $test2name
40             return
41         }
42         timeout {
43             fail $test1name
44             untested $test2name
45             return
46         }
47         eof { }
48     }
49     if ![check_exit_status $test1name] {
50         untested $test2name
51         return
52     }
53     if ![file exists $dumpfile]||![file exists $dumpokfile] {
54         fail $test1name
55         untested $test2name
56         return
57     }
58     pass $test1name
59
60     spawn $KDB5_UTIL load $dumpfile
61     expect {
62         -re "..*" {
63             fail $test2name
64             return
65         }
66         timeout {
67             fail $test2name
68             return
69         }
70         eof { }
71     }
72     if [check_exit_status $test2name] {
73         pass $test2name
74     }
75 }
76
77 proc kinit_wrong_pw { name badpass } {
78     global REALMNAME
79     global KINIT
80     global spawn_id
81
82     # Use kinit to get a ticket.
83         #
84         # For now always get forwardable tickets. Later when we need to make
85         # tests that distiguish between forwardable tickets and otherwise
86         # we should but another option to this proc. --proven
87         #
88     spawn $KINIT -5 -f $name@$REALMNAME
89     expect {
90         "Password for $name@$REALMNAME:" {
91             verbose "kinit started"
92         }
93         timeout {
94             fail "kinit bad pw"
95             return 0
96         }
97         eof {
98             fail "kinit bad pw"
99             return 0
100         }
101     }
102     send "$badpass\r"
103     expect {
104         "Password incorrect while getting initial credentials" {
105         }
106         timeout {
107             fail "kinit bad pw"
108             # kill it?
109         }
110         eof {
111             fail "kinit bad pw"
112             return
113         }
114     }
115     expect eof
116
117     set status_list [wait -i $spawn_id]
118     catch "close -i $spawn_id"
119     verbose -log "exit status: $status_list"
120     if { [lindex $status_list 2] != 0 || [lindex $status_list 3] != 0 } {
121         pass "kinit bad pw"
122     } else {
123         fail "kinit bad pw"
124     }
125 }
126
127 proc doit { } {
128     global REALMNAME
129     global KLIST
130     global KDESTROY
131     global KEY
132     global KADMIN_LOCAL
133     global KTUTIL
134     global hostname
135     global tmppwd
136     global spawn_id
137     global supported_enctypes
138     global KRBIV
139     global portbase
140     global mode
141     global tmppwd
142
143     setup_kerberos_env kdc
144
145     # Start up the kerberos and kadmind daemons.
146     if ![start_kerberos_daemons 1] {
147         return
148     }
149
150     # Use kadmin to add an host key.
151     if ![add_random_key host/$hostname 1] {
152         return
153     }
154
155     spawn $KADMIN_LOCAL -q "addpol fred"
156     catch expect_after
157     expect {
158         timeout {
159             fail "kadmin.local addpol fred"
160         }
161         eof {
162             pass "kadmin.local addpol fred"
163         }
164     }
165     set k_stat [wait -i $spawn_id]
166     verbose "wait -i $spawn_id returned $k_stat (kadmin addpol)"
167     catch "close -i $spawn_id"
168
169     # Use ksrvutil to create a srvtab entry.
170     if ![setup_srvtab 1] {
171         return
172     }
173
174     # Test dump and load.  Continue on, whatever the result.
175     dump_and_reload
176
177     spawn $KADMIN_LOCAL -q "getpols"
178     expect {
179         fred {
180             pass "kadmin.local getpols"
181             expect eof
182         }
183         timeout {
184             fail "kadmin.local getpols"
185         }
186         eof {
187             fail "kadmin.local getpols"
188         }
189     }
190     set k_stat [wait -i $spawn_id]
191     verbose "wait -i $spawn_id returned $k_stat (kadmin addpol)"
192     catch "close -i $spawn_id"
193
194     # Test use of wrong password.
195     kinit_wrong_pw krbtest/admin wrongpassword
196
197     setup_kerberos_env client
198     # Use kinit to get a ticket.
199     if ![kinit krbtest/admin adminpass$KEY 1] {
200         return
201     }
202
203     if ![kinit_renew krbtest/admin adminpass$KEY 1] {
204         return
205     }
206
207     # Make sure that klist can see the ticket.
208     if ![do_klist "krbtest/admin@$REALMNAME" "krbtgt/$REALMNAME@$REALMNAME" "klist"] {
209         return
210     }
211
212 # Get a ticket to later use with FAST
213     if ![kinit krbtest/fast adminpass$KEY 1] {
214         return
215     }
216
217     # Use fast to get a ticket
218     if ![kinit_fast krbtest/fast adminpass$KEY 1] {
219         return
220     }
221
222     # Destroy the ticket.
223     spawn $KDESTROY -5
224     if ![check_exit_status "kdestroy"] {
225         return
226     }
227     pass "kdestroy"
228
229     # Double check that the ticket was destroyed.
230     if ![do_klist_err "klist after destroy"] { return }
231
232     if ![add_random_key WELLKNOWN/ANONYMOUS 0] {
233         return
234     }
235
236     # If we have anonymous  then test it
237     if [file exists "$tmppwd/../../../plugins/preauth/pkinit.so" ] {
238         kinit_anonymous "WELLKNOWN/ANONYMOUS"
239     }
240
241     if ![add_random_key foo/bar 1] {
242         return
243     }
244
245     set keytab $tmppwd/fookeytab
246     catch "exec rm -f $keytab"
247
248     modify_principal foo/bar -kvno 252
249     foreach vno {253 254 255 256 257 258} {
250         xst $tmppwd/fookeytab foo/bar
251         do_klist_kt $tmppwd/fookeytab "klist keytab foo/bar vno $vno"
252         kinit_kt "foo/bar" $tmppwd/fookeytab 1 "kt kvno $vno"
253         do_klist "foo/bar" "krbtgt/$REALMNAME@$REALMNAME" "klist kt foo/bar vno $vno"
254         do_kdestroy "kdestroy foo/bar vno $vno"
255     }
256     catch "exec rm -f $keytab"
257     # Check that kadmin.local can actually read the correct kvno, even
258     # if we don't expect kadmin to be able to.
259     setup_kerberos_env kdc
260     spawn $KADMIN_LOCAL -r $REALMNAME
261     set ok 1
262     expect_after {
263         timeout         { fail "kadmin.local correct high kvno" ; set ok 0 }
264         eof             { fail "kadmin.local correct high kvno" ; set ok 0 }
265     }
266     expect "kadmin.local: "
267     send "getprinc foo/bar\r"
268 #    exec sleep 10
269     expect "Key: vno $vno,"
270     send "quit\r"
271     expect eof
272     if [check_exit_status "kadmin.local examine foo/bar for high kvno"] {
273         if $ok {
274             pass "kadmin.local correct high kvno"
275         }
276     }
277 }
278
279 set status [catch doit msg]
280
281 stop_kerberos_daemons
282
283 if { $status != 0 } {
284     send_error "ERROR: error in standalone.exp\n"
285     send_error "$msg\n"
286     exit 1
287 }