fa721cb4ea06830f03d2c962cf2b51fa8111cbe3
[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     cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmpguest -p 139 $ADDARGS -c "get message.msgtest $PREFIX/message_out.$$" 2>&1'
264     eval echo "$cmd"
265     out=`eval $cmd`
266     ret=$?
267
268     if [ $ret != 0 ] ; then
269         echo "$out"
270         echo "failed getting sent message from $SERVER with error $ret"
271         false
272         return
273     fi
274
275     if [ cmp $PREFIX/message_out.$$ $tmpfile != 0 ] ; then
276         echo "failed comparison of message from $SERVER"
277         false
278         return
279     fi
280     true
281 }
282
283 # Test reading an owner-only file (logon as guest) fails.
284 test_owner_only_file()
285 {
286     prompt="NT_STATUS_ACCESS_DENIED opening remote file"
287     tmpfile=$PREFIX/smbclient.in.$$
288
289 ##
290 ## We can't do this as non-root. We always have rights to
291 ## read the file.
292 ##
293     if [ "$USERID" != 0 ] ; then
294         echo "skipping test_owner_only_file as non-root"
295         true
296         return
297     fi
298
299 ##
300 ## We can't do this with an encrypted connection. No credentials
301 ## to set up the channel.
302 ##
303     if [ "$ADDARGS" = "-e" ] ; then
304         echo "skipping test_owner_only_file with encrypted connection"
305         true
306         return
307     fi
308
309     cat > $tmpfile <<EOF
310 get unreadable_file
311 quit
312 EOF
313
314     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U% //$SERVER/ro-tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
315     eval echo "$cmd"
316     out=`eval $cmd`
317     ret=$?
318     rm -f $tmpfile
319
320     if [ $ret != 0 ] ; then
321         echo "$out"
322         echo "failed reading owner-only file with error $ret"
323         false
324         return
325     fi
326
327     echo "$out" | grep "$prompt" >/dev/null 2>&1
328
329     ret=$?
330     if [ $ret = 0 ] ; then
331         # got the correct prompt .. succeed
332         true
333     else
334         echo "$out"
335         echo "failed reading owner-only file - grep failed with $ret"
336         false
337     fi
338 }
339
340 # Test accessing an msdfs path.
341 test_msdfs_link()
342 {
343     tmpfile=$PREFIX/smbclient.in.$$
344     prompt="  msdfs-target  "
345
346     cat > $tmpfile <<EOF
347 ls
348 cd \\msdfs-src1
349 ls msdfs-target
350 quit
351 EOF
352
353     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
354     eval echo "$cmd"
355     out=`eval $cmd`
356     ret=$?
357     rm -f $tmpfile
358
359     if [ $ret != 0 ] ; then
360         echo "$out"
361         echo "failed accessing \\msdfs-src1 link with error $ret"
362         false
363         return
364     fi
365
366     echo "$out" | grep "$prompt" >/dev/null 2>&1
367
368     ret=$?
369     if [ $ret != 0 ] ; then
370         echo "$out"
371         echo "failed listing \\msdfs-src1 - grep failed with $ret"
372         false
373     fi
374
375     cat > $tmpfile <<EOF
376 ls
377 cd \\deeppath\\msdfs-src2
378 ls msdfs-target
379 quit
380 EOF
381
382     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
383     eval echo "$cmd"
384     out=`eval $cmd`
385     ret=$?
386     rm -f $tmpfile
387
388     if [ $ret != 0 ] ; then
389         echo "$out"
390         echo "failed accessing \\deeppath\\msdfs-src2 link with error $ret"
391         false
392         return
393     fi
394
395     echo "$out" | grep "$prompt" >/dev/null 2>&1
396
397     ret=$?
398     if [ $ret != 0 ] ; then
399         echo "$out"
400         echo "failed listing \\deeppath\\msdfs-src2 - grep failed with $ret"
401         false
402         return
403     else
404         true
405         return
406     fi
407 }
408
409 # Test authenticating using the winbind ccache
410 test_ccache_access()
411 {
412     $WBINFO --ccache-save="${USERNAME}%${PASSWORD}"
413     ret=$?
414
415     if [ $ret != 0 ] ; then
416         echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='${PASSWORD}')"
417         false
418         return
419     fi
420
421     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \
422         -c quit 2>&1
423     ret=$?
424
425     if [ $ret != 0 ] ; then
426         echo "smbclient failed to use cached credentials"
427         false
428         return
429     fi
430
431     $WBINFO --ccache-save="${USERNAME}%GarBage"
432     ret=$?
433
434     if [ $ret != 0 ] ; then
435         echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='GarBage')"
436         false
437         return
438     fi
439
440     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \
441         -c quit 2>&1
442     ret=$?
443
444     if [ $ret -eq 0 ] ; then
445         echo "smbclient succeeded with wrong cached credentials"
446         false
447         return
448     fi
449
450     $WBINFO --logoff
451 }
452
453 # Test authenticating using the winbind ccache
454 test_auth_file()
455 {
456     tmpfile=$PREFIX/smbclient.in.$$
457     cat > $tmpfile <<EOF
458 username=${USERNAME}
459 password=${PASSWORD}
460 domain=${DOMAIN}
461 EOF
462     $SMBCLIENT //$SERVER_IP/tmp --authentication-file=$tmpfile \
463         -c quit 2>&1
464     ret=$?
465     rm $tmpfile
466
467     if [ $ret != 0 ] ; then
468         echo "smbclient failed to use auth file"
469         false
470         return
471     fi
472
473     cat > $tmpfile <<EOF
474 username=${USERNAME}
475 password=xxxx
476 domain=${DOMAIN}
477 EOF
478     $SMBCLIENT //$SERVER_IP/tmp --authentication-file=$tmpfile\
479         -c quit 2>&1
480     ret=$?
481     rm $tmpfile
482
483     if [ $ret -eq 0 ] ; then
484         echo "smbclient succeeded with wrong auth file credentials"
485         false
486         return
487     fi
488 }
489
490 LOGDIR_PREFIX=test_smbclient_s3
491
492 # possibly remove old logdirs:
493
494 for OLDDIR in $(find ${PREFIX} -type d -name "${LOGDIR_PREFIX}_*") ;  do
495         echo "removing old directory ${OLDDIR}"
496         rm -rf ${OLDDIR}
497 done
498
499 LOGDIR=$(mktemp -d ${PREFIX}/${LOGDIR_PREFIX}_XXXXXX)
500
501
502 testit "smbclient -L $SERVER_IP" $SMBCLIENT -L $SERVER_IP -N -p 139 || failed=`expr $failed + 1`
503 testit "smbclient -L $SERVER -I $SERVER_IP" $SMBCLIENT -L $SERVER -I $SERVER_IP -N -p 139 -c quit || failed=`expr $failed + 1`
504
505 testit "noninteractive smbclient does not prompt" \
506     test_noninteractive_no_prompt || \
507     failed=`expr $failed + 1`
508
509 testit "noninteractive smbclient -l does not prompt" \
510    test_noninteractive_no_prompt -l $LOGDIR || \
511     failed=`expr $failed + 1`
512
513 testit "interactive smbclient prompts on stdout" \
514    test_interactive_prompt_stdout || \
515     failed=`expr $failed + 1`
516
517 testit "interactive smbclient -l prompts on stdout" \
518    test_interactive_prompt_stdout -l $LOGDIR || \
519     failed=`expr $failed + 1`
520
521 testit "creating a bad symlink and deleting it" \
522    test_bad_symlink || \
523    failed=`expr $failed + 1`
524
525 testit "creating a good symlink and deleting it by path" \
526    test_good_symlink || \
527    failed=`expr $failed + 1`
528
529 testit "writing into a read-only directory fails" \
530    test_read_only_dir || \
531    failed=`expr $failed + 1`
532
533 testit "Reading a owner-only file fails" \
534    test_owner_only_file || \
535    failed=`expr $failed + 1`
536
537 testit "Accessing an MS-DFS link" \
538    test_msdfs_link || \
539    failed=`expr $failed + 1`
540
541 testit "ccache access works for smbclient" \
542     test_ccache_access || \
543     failed=`expr $failed + 1`
544
545 testit "sending a message to the remote server" \
546     test_message || \
547     failed=`expr $failed + 1`
548
549 testit "using an authentication file" \
550     test_auth_file || \
551     failed=`expr $failed + 1`
552
553 testit "rm -rf $LOGDIR" \
554     rm -rf $LOGDIR || \
555     failed=`expr $failed + 1`
556
557 testok $0 $failed