selftest: explain how the message command test works
[amitay/samba.git] / source3 / script / tests / test_smbclient_s3.sh
1 #!/bin/sh
2
3 # this runs the file serving tests that are expected to pass with samba3
4
5 if [ $# -lt 7 ]; then
6 cat <<EOF
7 Usage: test_smbclient_s3.sh SERVER SERVER_IP DOMAIN USERNAME PASSWORD USERID LOCAL_PATH PREFIX SMBCLIENT
8 EOF
9 exit 1;
10 fi
11
12 SERVER="$1"
13 SERVER_IP="$2"
14 DOMAIN="$3"
15 USERNAME="$4"
16 PASSWORD="$5"
17 USERID="$6"
18 LOCAL_PATH="$7"
19 PREFIX="$8"
20 SMBCLIENT="$9"
21 SMBCLIENT="$VALGRIND ${SMBCLIENT}"
22 WBINFO="$VALGRIND ${WBINFO:-$BINDIR/wbinfo}"
23 shift 9
24 ADDARGS="$*"
25
26 incdir=`dirname $0`/../../../testprogs/blackbox
27 . $incdir/subunit.sh
28
29 failed=0
30
31 # Test that a noninteractive smbclient does not prompt
32 test_noninteractive_no_prompt()
33 {
34     prompt="smb"
35
36     cmd='echo du | $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS 2>&1'
37     eval echo "$cmd"
38     out=`eval $cmd`
39
40     if [ $? != 0 ] ; then
41         echo "$out"
42         echo "command failed"
43         false
44         return
45     fi
46
47     echo "$out" | grep $prompt >/dev/null 2>&1
48
49     if [ $? = 0 ] ; then
50         # got a prompt .. fail
51         echo matched interactive prompt in non-interactive mode
52         false
53     else
54         true
55     fi
56 }
57
58 # Test that an interactive smbclient prompts to stdout
59 test_interactive_prompt_stdout()
60 {
61     prompt="smb"
62     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
63
64     cat > $tmpfile <<EOF
65 du
66 quit
67 EOF
68
69     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
70     eval echo "$cmd"
71     out=`eval $cmd`
72     ret=$?
73     rm -f $tmpfile
74
75     if [ $ret != 0 ] ; then
76         echo "$out"
77         echo "command failed"
78         false
79         return
80     fi
81
82     echo "$out" | grep $prompt >/dev/null 2>&1
83
84     if [ $? = 0 ] ; then
85         # got a prompt .. succeed
86         true
87     else
88         echo failed to match interactive prompt on stdout
89         false
90     fi
91 }
92
93 # Test creating a bad symlink and deleting it.
94 test_bad_symlink()
95 {
96     prompt="posix_unlink deleted file /newname"
97     tmpfile=$PREFIX/smbclient_bad_symlinks_commands
98
99     cat > $tmpfile <<EOF
100 posix
101 posix_unlink newname
102 symlink badname newname
103 posix_unlink newname
104 quit
105 EOF
106
107     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
108     eval echo "$cmd"
109     out=`eval $cmd`
110     ret=$?
111     rm -f $tmpfile
112
113     if [ $ret != 0 ] ; then
114         echo "$out"
115         echo "failed create then delete bad symlink with error $ret"
116         false
117         return
118     fi
119
120     echo "$out" | grep "$prompt" >/dev/null 2>&1
121
122     ret=$?
123     if [ $ret = 0 ] ; then
124         # got the correct prompt .. succeed
125         true
126     else
127         echo "$out"
128         echo "failed create then delete bad symlink - grep failed with $ret"
129         false
130     fi
131 }
132
133 # Test creating a good symlink and deleting it by path.
134 test_good_symlink()
135 {
136     tmpfile=$PREFIX/smbclient.in.$$
137     slink_name="$LOCAL_PATH/slink"
138     slink_target="$LOCAL_PATH/slink_target"
139
140     touch $slink_target
141     ln -s $slink_target $slink_name
142     cat > $tmpfile <<EOF
143 del slink
144 quit
145 EOF
146
147     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
148     eval echo "$cmd"
149     out=`eval $cmd`
150     ret=$?
151     rm -f $tmpfile
152
153     if [ $ret != 0 ] ; then
154         echo "$out"
155         echo "failed delete good symlink with error $ret"
156         rm $slink_target
157         rm $slink_name
158         false
159         return
160     fi
161
162     if [ ! -e $slink_target ] ; then
163         echo "failed delete good symlink - symlink target deleted !"
164         rm $slink_target
165         rm $slink_name
166         false
167         return
168     fi
169
170     if [ -e $slink_name ] ; then
171         echo "failed delete good symlink - symlink still exists"
172         rm $slink_target
173         rm $slink_name
174         false
175     else
176         # got the correct prompt .. succeed
177         rm $slink_target
178         true
179     fi
180 }
181
182 # Test writing into a read-only directory (logon as guest) fails.
183 test_read_only_dir()
184 {
185     prompt="NT_STATUS_ACCESS_DENIED making remote directory"
186     tmpfile=$PREFIX/smbclient.in.$$
187
188 ##
189 ## We can't do this as non-root. We always have rights to
190 ## create the directory.
191 ##
192     if [ "$USERID" != 0 ] ; then
193         echo "skipping test_read_only_dir as non-root"
194         true
195         return
196     fi
197
198 ##
199 ## We can't do this with an encrypted connection. No credentials
200 ## to set up the channel.
201 ##
202     if [ "$ADDARGS" = "-e" ] ; then
203         echo "skipping test_read_only_dir with encrypted connection"
204         true
205         return
206     fi
207
208     cat > $tmpfile <<EOF
209 mkdir a_test_dir
210 quit
211 EOF
212
213     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U% //$SERVER/ro-tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
214     eval echo "$cmd"
215     out=`eval $cmd`
216     ret=$?
217     rm -f $tmpfile
218
219     if [ $ret != 0 ] ; then
220         echo "$out"
221         echo "failed writing into read-only directory with error $ret"
222
223         false
224         return
225     fi
226
227     echo "$out" | grep "$prompt" >/dev/null 2>&1
228
229     ret=$?
230     if [ $ret = 0 ] ; then
231         # got the correct prompt .. succeed
232         true
233     else
234         echo "$out"
235         echo "failed writing into read-only directory - grep failed with $ret"
236         false
237     fi
238 }
239
240
241 # Test sending a message
242 test_message()
243 {
244     tmpfile=$PREFIX/message_in.$$
245
246     cat > $tmpfile <<EOF
247 Test message from pid $$
248 EOF
249
250     cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD -M $SERVER -p 139 $ADDARGS -n msgtest < $tmpfile 2>&1'
251     eval echo "$cmd"
252     out=`eval $cmd`
253     ret=$?
254
255     if [ $ret != 0 ] ; then
256         echo "$out"
257         echo "failed sending message to $SERVER with error $ret"
258         false
259         rm -f $tmpfile
260         return
261     fi
262
263     # The server writes this into a file message.msgtest, via message.%m to test the % sub code
264     cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmpguest -p 139 $ADDARGS -c "get message.msgtest $PREFIX/message_out.$$" 2>&1'
265     eval echo "$cmd"
266     out=`eval $cmd`
267     ret=$?
268
269     if [ $ret != 0 ] ; then
270         echo "$out"
271         echo "failed getting sent message from $SERVER with error $ret"
272         false
273         return
274     fi
275
276     if [ cmp $PREFIX/message_out.$$ $tmpfile != 0 ] ; then
277         echo "failed comparison of message from $SERVER"
278         false
279         return
280     fi
281     true
282 }
283
284 # Test reading an owner-only file (logon as guest) fails.
285 test_owner_only_file()
286 {
287     prompt="NT_STATUS_ACCESS_DENIED opening remote file"
288     tmpfile=$PREFIX/smbclient.in.$$
289
290 ##
291 ## We can't do this as non-root. We always have rights to
292 ## read the file.
293 ##
294     if [ "$USERID" != 0 ] ; then
295         echo "skipping test_owner_only_file as non-root"
296         true
297         return
298     fi
299
300 ##
301 ## We can't do this with an encrypted connection. No credentials
302 ## to set up the channel.
303 ##
304     if [ "$ADDARGS" = "-e" ] ; then
305         echo "skipping test_owner_only_file with encrypted connection"
306         true
307         return
308     fi
309
310     cat > $tmpfile <<EOF
311 get unreadable_file
312 quit
313 EOF
314
315     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U% //$SERVER/ro-tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
316     eval echo "$cmd"
317     out=`eval $cmd`
318     ret=$?
319     rm -f $tmpfile
320
321     if [ $ret != 0 ] ; then
322         echo "$out"
323         echo "failed reading owner-only file with error $ret"
324         false
325         return
326     fi
327
328     echo "$out" | grep "$prompt" >/dev/null 2>&1
329
330     ret=$?
331     if [ $ret = 0 ] ; then
332         # got the correct prompt .. succeed
333         true
334     else
335         echo "$out"
336         echo "failed reading owner-only file - grep failed with $ret"
337         false
338     fi
339 }
340
341 # Test accessing an msdfs path.
342 test_msdfs_link()
343 {
344     tmpfile=$PREFIX/smbclient.in.$$
345     prompt="  msdfs-target  "
346
347     cat > $tmpfile <<EOF
348 ls
349 cd \\msdfs-src1
350 ls msdfs-target
351 quit
352 EOF
353
354     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
355     eval echo "$cmd"
356     out=`eval $cmd`
357     ret=$?
358     rm -f $tmpfile
359
360     if [ $ret != 0 ] ; then
361         echo "$out"
362         echo "failed accessing \\msdfs-src1 link with error $ret"
363         false
364         return
365     fi
366
367     echo "$out" | grep "$prompt" >/dev/null 2>&1
368
369     ret=$?
370     if [ $ret != 0 ] ; then
371         echo "$out"
372         echo "failed listing \\msdfs-src1 - grep failed with $ret"
373         false
374     fi
375
376     cat > $tmpfile <<EOF
377 ls
378 cd \\deeppath\\msdfs-src2
379 ls msdfs-target
380 quit
381 EOF
382
383     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
384     eval echo "$cmd"
385     out=`eval $cmd`
386     ret=$?
387     rm -f $tmpfile
388
389     if [ $ret != 0 ] ; then
390         echo "$out"
391         echo "failed accessing \\deeppath\\msdfs-src2 link with error $ret"
392         false
393         return
394     fi
395
396     echo "$out" | grep "$prompt" >/dev/null 2>&1
397
398     ret=$?
399     if [ $ret != 0 ] ; then
400         echo "$out"
401         echo "failed listing \\deeppath\\msdfs-src2 - grep failed with $ret"
402         false
403         return
404     else
405         true
406         return
407     fi
408 }
409
410 # Test authenticating using the winbind ccache
411 test_ccache_access()
412 {
413     $WBINFO --ccache-save="${USERNAME}%${PASSWORD}"
414     ret=$?
415
416     if [ $ret != 0 ] ; then
417         echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='${PASSWORD}')"
418         false
419         return
420     fi
421
422     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \
423         -c quit 2>&1
424     ret=$?
425
426     if [ $ret != 0 ] ; then
427         echo "smbclient failed to use cached credentials"
428         false
429         return
430     fi
431
432     $WBINFO --ccache-save="${USERNAME}%GarBage"
433     ret=$?
434
435     if [ $ret != 0 ] ; then
436         echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='GarBage')"
437         false
438         return
439     fi
440
441     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \
442         -c quit 2>&1
443     ret=$?
444
445     if [ $ret -eq 0 ] ; then
446         echo "smbclient succeeded with wrong cached credentials"
447         false
448         return
449     fi
450
451     $WBINFO --logoff
452 }
453
454 # Test authenticating using the winbind ccache
455 test_auth_file()
456 {
457     tmpfile=$PREFIX/smbclient.in.$$
458     cat > $tmpfile <<EOF
459 username=${USERNAME}
460 password=${PASSWORD}
461 domain=${DOMAIN}
462 EOF
463     $SMBCLIENT //$SERVER_IP/tmp --authentication-file=$tmpfile \
464         -c quit 2>&1
465     ret=$?
466     rm $tmpfile
467
468     if [ $ret != 0 ] ; then
469         echo "smbclient failed to use auth file"
470         false
471         return
472     fi
473
474     cat > $tmpfile <<EOF
475 username=${USERNAME}
476 password=xxxx
477 domain=${DOMAIN}
478 EOF
479     $SMBCLIENT //$SERVER_IP/tmp --authentication-file=$tmpfile\
480         -c quit 2>&1
481     ret=$?
482     rm $tmpfile
483
484     if [ $ret -eq 0 ] ; then
485         echo "smbclient succeeded with wrong auth file credentials"
486         false
487         return
488     fi
489 }
490
491 LOGDIR_PREFIX=test_smbclient_s3
492
493 # possibly remove old logdirs:
494
495 for OLDDIR in $(find ${PREFIX} -type d -name "${LOGDIR_PREFIX}_*") ;  do
496         echo "removing old directory ${OLDDIR}"
497         rm -rf ${OLDDIR}
498 done
499
500 LOGDIR=$(mktemp -d ${PREFIX}/${LOGDIR_PREFIX}_XXXXXX)
501
502
503 testit "smbclient -L $SERVER_IP" $SMBCLIENT -L $SERVER_IP -N -p 139 || failed=`expr $failed + 1`
504 testit "smbclient -L $SERVER -I $SERVER_IP" $SMBCLIENT -L $SERVER -I $SERVER_IP -N -p 139 -c quit || failed=`expr $failed + 1`
505
506 testit "noninteractive smbclient does not prompt" \
507     test_noninteractive_no_prompt || \
508     failed=`expr $failed + 1`
509
510 testit "noninteractive smbclient -l does not prompt" \
511    test_noninteractive_no_prompt -l $LOGDIR || \
512     failed=`expr $failed + 1`
513
514 testit "interactive smbclient prompts on stdout" \
515    test_interactive_prompt_stdout || \
516     failed=`expr $failed + 1`
517
518 testit "interactive smbclient -l prompts on stdout" \
519    test_interactive_prompt_stdout -l $LOGDIR || \
520     failed=`expr $failed + 1`
521
522 testit "creating a bad symlink and deleting it" \
523    test_bad_symlink || \
524    failed=`expr $failed + 1`
525
526 testit "creating a good symlink and deleting it by path" \
527    test_good_symlink || \
528    failed=`expr $failed + 1`
529
530 testit "writing into a read-only directory fails" \
531    test_read_only_dir || \
532    failed=`expr $failed + 1`
533
534 testit "Reading a owner-only file fails" \
535    test_owner_only_file || \
536    failed=`expr $failed + 1`
537
538 testit "Accessing an MS-DFS link" \
539    test_msdfs_link || \
540    failed=`expr $failed + 1`
541
542 testit "ccache access works for smbclient" \
543     test_ccache_access || \
544     failed=`expr $failed + 1`
545
546 testit "sending a message to the remote server" \
547     test_message || \
548     failed=`expr $failed + 1`
549
550 testit "using an authentication file" \
551     test_auth_file || \
552     failed=`expr $failed + 1`
553
554 testit "rm -rf $LOGDIR" \
555     rm -rf $LOGDIR || \
556     failed=`expr $failed + 1`
557
558 testok $0 $failed