s3: tests: Regression test to ensure we can never return a DIRECTORY attribute on...
[metze/samba/wip.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 13 ]; then
6 cat <<EOF
7 Usage: test_smbclient_s3.sh SERVER SERVER_IP DOMAIN USERNAME PASSWORD USERID LOCAL_PATH PREFIX SMBCLIENT WBINFO NET CONFIGURATION PROTOCOL
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 WBINFO="${10}"
22 NET="${11}"
23 CONFIGURATION="${12}"
24 PROTOCOL="${13}"
25 SMBCLIENT="$VALGRIND ${SMBCLIENT}"
26 WBINFO="$VALGRIND ${WBINFO}"
27 shift 13
28 RAWARGS="${CONFIGURATION} -m${PROTOCOL}"
29 ADDARGS="${RAWARGS} $*"
30
31 incdir=`dirname $0`/../../../testprogs/blackbox
32 . $incdir/subunit.sh
33
34 failed=0
35
36 # Test that a noninteractive smbclient does not prompt
37 test_noninteractive_no_prompt()
38 {
39     prompt="smb"
40
41     cmd='echo du | $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS 2>&1'
42     eval echo "$cmd"
43     out=`eval $cmd`
44
45     if [ $? != 0 ] ; then
46         echo "$out"
47         echo "command failed"
48         return 1
49     fi
50
51     echo "$out" | grep $prompt >/dev/null 2>&1
52
53     if [ $? = 0 ] ; then
54         # got a prompt .. fail
55         echo matched interactive prompt in non-interactive mode
56         return 1
57     fi
58
59     return 0
60 }
61
62 # Test that an interactive smbclient prompts to stdout
63 test_interactive_prompt_stdout()
64 {
65     prompt="smb"
66     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
67
68     cat > $tmpfile <<EOF
69 du
70 quit
71 EOF
72
73     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
74     eval echo "$cmd"
75     out=`eval $cmd`
76     ret=$?
77     rm -f $tmpfile
78
79     if [ $ret != 0 ] ; then
80         echo "$out"
81         echo "command failed"
82         return 1
83     fi
84
85     echo "$out" | grep $prompt >/dev/null 2>&1
86
87     if [ $? != 0 ] ; then
88         echo failed to match interactive prompt on stdout
89         return 1
90     fi
91
92     return 0
93 }
94
95 # Test creating a bad symlink and deleting it.
96 test_bad_symlink()
97 {
98     prompt="posix_unlink deleted file /newname"
99     tmpfile=$PREFIX/smbclient_bad_symlinks_commands
100
101     cat > $tmpfile <<EOF
102 posix
103 posix_unlink newname
104 symlink badname newname
105 posix_unlink newname
106 quit
107 EOF
108
109     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
110     eval echo "$cmd"
111     out=`eval $cmd`
112     ret=$?
113     rm -f $tmpfile
114
115     if [ $ret != 0 ] ; then
116         echo "$out"
117         echo "failed create then delete bad symlink with error $ret"
118         return 1
119     fi
120
121     echo "$out" | grep "$prompt" >/dev/null 2>&1
122
123     ret=$?
124     if [ $ret != 0 ] ; then
125         echo "$out"
126         echo "failed create then delete bad symlink - grep failed with $ret"
127         return 1
128     fi
129
130     return 0
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         return 1
159     fi
160
161     if [ ! -e $slink_target ] ; then
162         echo "failed delete good symlink - symlink target deleted !"
163         rm $slink_target
164         rm $slink_name
165         return 1
166     fi
167
168     if [ -e $slink_name ] ; then
169         echo "failed delete good symlink - symlink still exists"
170         rm $slink_target
171         rm $slink_name
172         return 1
173     fi
174
175     rm $slink_target
176     return 0
177 }
178
179 # Test writing into a read-only directory (logon as guest) fails.
180 test_read_only_dir()
181 {
182     prompt="NT_STATUS_ACCESS_DENIED making remote directory"
183     tmpfile=$PREFIX/smbclient.in.$$
184
185 ##
186 ## We can't do this as non-root. We always have rights to
187 ## create the directory.
188 ##
189     if [ "$USERID" != 0 ] ; then
190         echo "skipping test_read_only_dir as non-root"
191         return 0
192     fi
193
194 ##
195 ## We can't do this with an encrypted connection. No credentials
196 ## to set up the channel.
197 ##
198     if [ "$ADDARGS" = "-e" ] ; then
199         echo "skipping test_read_only_dir with encrypted connection"
200         return 0
201     fi
202
203     cat > $tmpfile <<EOF
204 mkdir a_test_dir
205 quit
206 EOF
207
208     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT -U% "//$SERVER/$1" -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
209     eval echo "$cmd"
210     out=`eval $cmd`
211     ret=$?
212     rm -f $tmpfile
213
214     if [ $ret != 0 ] ; then
215         echo "$out"
216         echo "failed writing into read-only directory with error $ret"
217
218         return 1
219     fi
220
221     echo "$out" | grep "$prompt" >/dev/null 2>&1
222
223     ret=$?
224     if [ $ret != 0 ] ; then
225         echo "$out"
226         echo "failed writing into read-only directory - grep failed with $ret"
227         return 1
228     fi
229
230     return 0
231 }
232
233
234 # Test sending a message
235 test_message()
236 {
237     tmpfile=$PREFIX/message_in.$$
238
239     cat > $tmpfile <<EOF
240 Test message from pid $$
241 EOF
242
243     cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD -M $SERVER -p 139 $ADDARGS -n msgtest < $tmpfile 2>&1'
244     eval echo "$cmd"
245     out=`eval $cmd`
246     ret=$?
247
248     if [ $ret != 0 ] ; then
249         echo "$out"
250         echo "failed sending message to $SERVER with error $ret"
251         rm -f $tmpfile
252         return 1
253     fi
254
255     # The server writes this into a file message.msgtest, via message.%m to test the % sub code
256     cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmpguest -p 139 $ADDARGS -c "get message.msgtest $PREFIX/message_out.$$" 2>&1'
257     eval echo "$cmd"
258     out=`eval $cmd`
259     ret=$?
260
261     if [ $ret != 0 ] ; then
262         echo "$out"
263         echo "failed getting sent message from $SERVER with error $ret"
264         return 1
265     fi
266
267     if [ cmp $PREFIX/message_out.$$ $tmpfile != 0 ] ; then
268         echo "failed comparison of message from $SERVER"
269         return 1
270     fi
271
272     return 0
273 }
274
275 # Test reading an owner-only file (logon as guest) fails.
276 test_owner_only_file()
277 {
278     prompt="NT_STATUS_ACCESS_DENIED opening remote file"
279     tmpfile=$PREFIX/smbclient.in.$$
280
281 ##
282 ## We can't do this as non-root. We always have rights to
283 ## read the file.
284 ##
285     if [ "$USERID" != 0 ] ; then
286         echo "skipping test_owner_only_file as non-root"
287         return 0
288     fi
289
290 ##
291 ## We can't do this with an encrypted connection. No credentials
292 ## to set up the channel.
293 ##
294     if [ "$ADDARGS" = "-e" ] ; then
295         echo "skipping test_owner_only_file with encrypted connection"
296         return 0
297     fi
298
299     cat > $tmpfile <<EOF
300 get unreadable_file
301 quit
302 EOF
303
304     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U% //$SERVER/ro-tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
305     eval echo "$cmd"
306     out=`eval $cmd`
307     ret=$?
308     rm -f $tmpfile
309
310     if [ $ret != 0 ] ; then
311         echo "$out"
312         echo "failed reading owner-only file with error $ret"
313         return 1
314     fi
315
316     echo "$out" | grep "$prompt" >/dev/null 2>&1
317
318     ret=$?
319     if [ $ret != 0 ] ; then
320         echo "$out"
321         echo "failed reading owner-only file - grep failed with $ret"
322         return 1
323     fi
324
325     return 0
326 }
327
328 # Test accessing an msdfs path.
329 test_msdfs_link()
330 {
331     tmpfile=$PREFIX/smbclient.in.$$
332     prompt="  msdfs-target  "
333
334     cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS -m nt1 -c dir 2>&1'
335     out=`eval $cmd`
336     ret=$?
337
338     if [ $ret != 0 ] ; then
339         echo "$out"
340         echo "failed listing msfds-share\ with error $ret"
341         return 1
342     fi
343
344     cat > $tmpfile <<EOF
345 ls
346 cd \\msdfs-src1
347 ls msdfs-target
348 quit
349 EOF
350
351     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
352     eval echo "$cmd"
353     out=`eval $cmd`
354     ret=$?
355     rm -f $tmpfile
356
357     if [ $ret != 0 ] ; then
358         echo "$out"
359         echo "failed accessing \\msdfs-src1 link with error $ret"
360         return 1
361     fi
362
363     echo "$out" | grep "$prompt" >/dev/null 2>&1
364
365     ret=$?
366     if [ $ret != 0 ] ; then
367         echo "$out"
368         echo "failed listing \\msdfs-src1 - grep failed with $ret"
369         return 1
370     fi
371
372     cat > $tmpfile <<EOF
373 ls
374 cd \\deeppath\\msdfs-src2
375 ls msdfs-target
376 quit
377 EOF
378
379     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
380     eval echo "$cmd"
381     out=`eval $cmd`
382     ret=$?
383     rm -f $tmpfile
384
385     if [ $ret != 0 ] ; then
386         echo "$out"
387         echo "failed accessing \\deeppath\\msdfs-src2 link with error $ret"
388         return 1
389     fi
390
391     echo "$out" | grep "$prompt" >/dev/null 2>&1
392
393     ret=$?
394     if [ $ret != 0 ] ; then
395         echo "$out"
396         echo "failed listing \\deeppath\\msdfs-src2 - grep failed with $ret"
397         return 1
398     fi
399
400     return 0
401 }
402
403 # Archive bits are correctly set on file/dir creation and rename.
404 test_rename_archive_bit()
405 {
406     prompt_file="attributes: A (20)"
407     prompt_dir="attributes: D (10)"
408     tmpfile="$PREFIX/smbclient.in.$$"
409     filename="foo.$$"
410     filename_ren="bar.$$"
411     dirname="foodir.$$"
412     dirname_ren="bardir.$$"
413     filename_path="$PREFIX/$filename"
414     local_name1="$LOCAL_PATH/$filename"
415     local_name2="$LOCAL_PATH/$filename_ren"
416     local_dir_name1="$LOCAL_PATH/$dirname"
417     local_dir_name2="$LOCAL_PATH/$dirname_ren"
418
419     rm -f $filename_path
420     rm -f $local_name1
421     rm -f $local_name2
422
423 # Create a new file, ensure it has 'A' attributes.
424     touch $filename_path
425
426     cat > $tmpfile <<EOF
427 lcd $PREFIX
428 put $filename
429 allinfo $filename
430 quit
431 EOF
432
433     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
434     eval echo "$cmd"
435     out=`eval $cmd`
436     ret=$?
437     rm -f $tmpfile
438
439     if [ $ret != 0 ] ; then
440         echo "$out"
441         echo "failed creating file $filename with error $ret"
442         return 1
443     fi
444
445     echo "$out" | grep "$prompt_file" >/dev/null 2>&1
446
447     ret=$?
448
449     rm -f $filename_path
450     rm -f $local_name1
451     rm -f $local_name2
452
453     if [ $ret != 0 ] ; then
454         echo "$out"
455         echo "Attributes incorrect on new file $ret"
456         return 1
457     fi
458
459 # Now check if we remove 'A' and rename, the A comes back.
460     touch $filename_path
461
462     cat > $tmpfile <<EOF
463 lcd $PREFIX
464 put $filename
465 setmode $filename -a
466 ren $filename $filename_ren
467 allinfo $filename_ren
468 quit
469 EOF
470
471     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
472     eval echo "$cmd"
473     out=`eval $cmd`
474     ret=$?
475     rm -f $tmpfile
476
477     if [ $ret != 0 ] ; then
478         echo "$out"
479         echo "failed creating file and renaming $filename with error $ret"
480         return 1
481     fi
482
483     echo "$out" | grep "$prompt_file" >/dev/null 2>&1
484
485     ret=$?
486
487     rm -f $filename_path
488     rm -f $local_name1
489     rm -f $local_name2
490
491     if [ $ret != 0 ] ; then
492         echo "$out"
493         echo "Attributes incorrect on renamed file $ret"
494         return 1
495     fi
496
497     rm -rf $local_dir_name1
498     rm -rf $local_dir_name2
499
500 # Create a new directory, ensure it has 'D' but not 'A' attributes.
501
502     cat > $tmpfile <<EOF
503 mkdir $dirname
504 allinfo $dirname
505 quit
506 EOF
507
508     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
509     eval echo "$cmd"
510     out=`eval $cmd`
511     ret=$?
512     rm -f $tmpfile
513
514     if [ $ret != 0 ] ; then
515         echo "$out"
516         echo "failed creating directory $dirname with error $ret"
517         return 1
518     fi
519
520     echo "$out" | grep "$prompt_dir" >/dev/null 2>&1
521
522     ret=$?
523
524     rm -rf $local_dir_name1
525     rm -rf $local_dir_name2
526
527     if [ $ret != 0 ] ; then
528         echo "$out"
529         echo "Attributes incorrect on new directory $ret"
530         return 1
531     fi
532
533 # Now check if we rename, we still only have 'D' attributes
534
535     cat > $tmpfile <<EOF
536 mkdir $dirname
537 ren $dirname $dirname_ren
538 allinfo $dirname_ren
539 quit
540 EOF
541
542     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
543     eval echo "$cmd"
544     out=`eval $cmd`
545     ret=$?
546     rm -f $tmpfile
547
548     if [ $ret != 0 ] ; then
549         echo "$out"
550         echo "failed creating directory $dirname and renaming with error $ret"
551         return 1
552     fi
553
554     echo "$out" | grep "$prompt_dir" >/dev/null 2>&1
555
556     ret=$?
557
558     rm -f $local_name1
559     rm -f $local_name2
560
561     if [ $ret != 0 ] ; then
562         echo "$out"
563         echo "Attributes incorrect on renamed directory $ret"
564         return 1
565     fi
566
567     return 0
568 }
569
570 # Test authenticating using the winbind ccache
571 test_ccache_access()
572 {
573     $WBINFO --ccache-save="${USERNAME}%${PASSWORD}"
574     ret=$?
575
576     if [ $ret != 0 ] ; then
577         echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='${PASSWORD}')"
578         return 1
579     fi
580
581     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}" $ADDARGS -c quit 2>&1
582     ret=$?
583
584     if [ $ret != 0 ] ; then
585         echo "smbclient failed to use cached credentials"
586         return 1
587     fi
588
589     $WBINFO --ccache-save="${USERNAME}%GarBage"
590     ret=$?
591
592     if [ $ret != 0 ] ; then
593         echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='GarBage')"
594         return 1
595     fi
596
597     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}" $ADDARGS -c quit 2>&1
598     ret=$?
599
600     if [ $ret -eq 0 ] ; then
601         echo "smbclient succeeded with wrong cached credentials"
602         return 1
603     fi
604
605     $WBINFO --logoff
606 }
607
608 # Test authenticating using the winbind ccache
609 test_auth_file()
610 {
611     tmpfile=$PREFIX/smbclient.in.$$
612     cat > $tmpfile <<EOF
613 username=${USERNAME}
614 password=${PASSWORD}
615 domain=${DOMAIN}
616 EOF
617     $SMBCLIENT //$SERVER_IP/tmp --authentication-file=$tmpfile $ADDARGS -c quit 2>&1
618     ret=$?
619     rm $tmpfile
620
621     if [ $ret != 0 ] ; then
622         echo "smbclient failed to use auth file"
623         return 1
624     fi
625
626     cat > $tmpfile <<EOF
627 username=${USERNAME}
628 password=xxxx
629 domain=${DOMAIN}
630 EOF
631     $SMBCLIENT //$SERVER_IP/tmp --authentication-file=$tmpfile $ADDARGS -c quit 2>&1
632     ret=$?
633     rm $tmpfile
634
635     if [ $ret -eq 0 ] ; then
636         echo "smbclient succeeded with wrong auth file credentials"
637         return 1
638     fi
639 }
640
641 # Test doing a directory listing with backup privilege.
642 test_backup_privilege_list()
643 {
644     tmpfile=$PREFIX/smbclient_backup_privilege_list
645
646     # selftest uses the forward slash as a separator, but "net sam rights
647     # grant" requires the backslash separator
648     USER_TMP=$(printf '%s' "$USERNAME" | tr '/' '\\')
649
650     # If we don't have a DOMAIN component to the username, add it.
651     printf '%s' "$USER_TMP" | grep '\\' 2>&1
652     ret=$?
653     if [ $ret != 0 ] ; then
654         priv_username="$DOMAIN\\$USER_TMP"
655     else
656         priv_username="$USER_TMP"
657     fi
658
659     $NET sam rights grant $priv_username SeBackupPrivilege 2>&1
660     ret=$?
661     if [ $ret != 0 ] ; then
662         echo "Failed to add SeBackupPrivilege to user $priv_username - $ret"
663         return 1
664     fi
665
666     cat > $tmpfile <<EOF
667 backup
668 ls
669 quit
670 EOF
671
672     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
673     eval echo "$cmd"
674     out=`eval $cmd`
675     ret=$?
676     rm -f $tmpfile
677
678     if [ $ret != 0 ] ; then
679         echo "$out"
680         echo "failed backup privilege list $ret"
681         return 1
682     fi
683
684 # Now remove all privileges from this SID.
685     $NET sam rights revoke $priv_username SeBackupPrivilege 2>&1
686     ret=$?
687     if [ $ret != 0 ] ; then
688         echo "failed to remove SeBackupPrivilege from user $priv_username - $ret"
689         return 1
690     fi
691 }
692
693 # Test accessing an share with bad names (won't convert).
694 test_bad_names()
695 {
696     # First with SMB1
697     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/badname-tmp -I $SERVER_IP $ADDARGS -mNT1 -c ls 2>&1'
698     eval echo "$cmd"
699     out=`eval $cmd`
700     ret=$?
701
702     if [ $ret != 0 ] ; then
703         echo "$out"
704         echo "failed accessing badname-tmp (SMB1) with error $ret"
705         return 1
706     fi
707
708     echo "$out" | wc -l 2>&1 | grep 5
709     ret=$?
710     if [ $ret != 0 ] ; then
711         echo "$out"
712         echo "failed listing \\badname-tmp - grep of number of lines (1) failed with $ret"
713         return 1
714     fi
715
716     echo "$out" | grep '^  \. *D'
717     ret=$?
718     if [ $ret != 0 ] ; then
719         echo "$out"
720         echo "failed listing \\badname-tmp - grep (1) failed with $ret"
721         return 1
722     fi
723
724     echo "$out" | grep '^  \.\. *D'
725     ret=$?
726     if [ $ret != 0 ] ; then
727         echo "$out"
728         echo "failed listing \\badname-tmp - grep (2) failed with $ret"
729         return 1
730     fi
731
732     echo "$out" | grep '^  blank.txt *N'
733     ret=$?
734     if [ $ret != 0 ] ; then
735         echo "$out"
736         echo "failed listing \\badname-tmp - grep (3) failed with $ret"
737         return 1
738     fi
739
740     echo "$out" | grep '^ *$'
741     ret=$?
742     if [ $ret != 0 ] ; then
743         echo "$out"
744         echo "failed listing \\badname-tmp - grep (4) failed with $ret"
745         return 1
746     fi
747
748     echo "$out" | grep 'blocks of size.*blocks available'
749     ret=$?
750     if [ $ret != 0 ] ; then
751         echo "$out"
752         echo "failed listing \\badname-tmp - grep (5) failed with $ret"
753         return 1
754     fi
755
756     # Now check again with -mSMB3
757     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/badname-tmp -I $SERVER_IP $ADDARGS -mSMB3 -c ls 2>&1'
758     eval echo "$cmd"
759     out=`eval $cmd`
760     ret=$?
761
762     if [ $ret != 0 ] ; then
763         echo "$out"
764         echo "failed accessing badname-tmp (SMB3) with error $ret"
765         return 1
766     fi
767
768     echo "$out" | wc -l 2>&1 | grep 5
769     ret=$?
770     if [ $ret != 0 ] ; then
771         echo "$out"
772         echo "failed listing \\badname-tmp - SMB3 grep of number of lines (1) failed with $ret"
773         return 1
774     fi
775
776     echo "$out" | grep '^  \. *D'
777     ret=$?
778     if [ $ret != 0 ] ; then
779         echo "$out"
780         echo "failed listing \\badname-tmp - SMB3 grep (1) failed with $ret"
781         return 1
782     fi
783
784     echo "$out" | grep '^  \.\. *D'
785     ret=$?
786     if [ $ret != 0 ] ; then
787         echo "$out"
788         echo "failed listing \\badname-tmp - SMB3 grep (2) failed with $ret"
789         return 1
790     fi
791
792     echo "$out" | grep '^  blank.txt *N'
793     ret=$?
794     if [ $ret != 0 ] ; then
795         echo "$out"
796         echo "failed listing \\badname-tmp - SMB3 grep (3) failed with $ret"
797         return 1
798     fi
799
800     echo "$out" | grep '^ *$'
801     ret=$?
802     if [ $ret != 0 ] ; then
803         echo "$out"
804         echo "failed listing \\badname-tmp - SMB3 grep (4) failed with $ret"
805         return 1
806     fi
807
808     echo "$out" | grep 'blocks of size.*blocks available'
809     ret=$?
810     if [ $ret != 0 ] ; then
811         echo "$out"
812         echo "failed listing \\badname-tmp - SMB3 grep (5) failed with $ret"
813         return 1
814     fi
815 }
816
817 # Test accessing an share with a name that must be mangled - with acl_xattrs.
818 # We know foo:bar gets mangled to FF4GBY~Q with the default name-mangling algorithm (hash2).
819 test_mangled_names()
820 {
821     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
822     cat > $tmpfile <<EOF
823 ls
824 cd FF4GBY~Q
825 ls
826 quit
827 EOF
828     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/manglenames_share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
829     eval echo "$cmd"
830     out=`eval $cmd`
831     ret=$?
832     rm -f $tmpfile
833
834     if [ $ret != 0 ] ; then
835         echo "$out"
836         echo "failed accessing manglenames_share with error $ret"
837         return 1
838     fi
839
840     echo "$out" | grep 'NT_STATUS'
841     ret=$?
842     if [ $ret = 0 ] ; then
843         echo "$out"
844         echo "failed - NT_STATUS_XXXX listing \\manglenames_share\\FF4GBY~Q"
845         return 1
846     fi
847 }
848
849 # Test using scopy to copy a file on the server.
850 test_scopy()
851 {
852     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
853     scopy_file=$PREFIX/scopy_file
854
855     rm -f $scopy_file
856     cat > $tmpfile <<EOF
857 put ${SMBCLIENT}
858 scopy smbclient scopy_file
859 lcd ${PREFIX}
860 get scopy_file
861 del smbclient
862 del scopy_file
863 quit
864 EOF
865     # First SMB3
866     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS -mSMB3 < $tmpfile 2>&1'
867     eval echo "$cmd"
868     out=`eval $cmd`
869     ret=$?
870     out1=`md5sum ${SMBCLIENT} | sed -e 's/ .*//'`
871     out2=`md5sum ${scopy_file} | sed -e 's/ .*//'`
872     rm -f $tmpfile
873     rm -f $scopy_file
874
875     if [ $ret != 0 ] ; then
876         echo "$out"
877         echo "failed scopy test (1) with output $ret"
878         return 1
879     fi
880
881     if [ $out1 != $out2 ] ; then
882         echo "$out1 $out2"
883         echo "failed md5sum (1)"
884         return 1
885     fi
886
887 #
888 # Now do again using SMB1
889 # to force client-side fallback.
890 #
891
892     cat > $tmpfile <<EOF
893 put ${SMBCLIENT}
894 scopy smbclient scopy_file
895 lcd ${PREFIX}
896 get scopy_file
897 del smbclient
898 del scopy_file
899 quit
900 EOF
901     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS -mNT1 < $tmpfile 2>&1'
902     eval echo "$cmd"
903     out=`eval $cmd`
904     ret=$?
905     out1=`md5sum ${SMBCLIENT} | sed -e 's/ .*//'`
906     out2=`md5sum ${scopy_file} | sed -e 's/ .*//'`
907     rm -f $tmpfile
908     rm -f $scopy_file
909
910     if [ $ret != 0 ] ; then
911         echo "$out"
912         echo "failed scopy test (2) with output $ret"
913         return 1
914     fi
915
916     if [ $out1 != $out2 ] ; then
917         echo "$out1 $out2"
918         echo "failed md5sum (2)"
919         return 1
920     fi
921 }
922
923 # Test creating a stream on the root of the share directory filname - :foobar
924 test_toplevel_stream()
925 {
926     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
927     cat > $tmpfile <<EOF
928 put ${PREFIX}/smbclient_interactive_prompt_commands :foobar
929 allinfo \\
930 setmode \\ -a
931 quit
932 EOF
933     # Only with SMB3???
934     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS -mSMB3 < $tmpfile 2>&1'
935     eval echo "$cmd"
936     out=`eval $cmd`
937     ret=$?
938     rm -f $tmpfile
939
940     if [ $ret != 0 ] ; then
941         echo "$out"
942         echo "failed creating toplevel stream :foobar with error $ret"
943         return 1
944     fi
945
946     echo "$out" | grep '^stream:.*:foobar'
947     ret=$?
948     if [ $ret != 0 ] ; then
949         echo "$out"
950         echo "failed creating toplevel stream :foobar"
951         return 1
952     fi
953 }
954
955 # Test wide links are restricted.
956 test_widelinks()
957 {
958     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
959     cat > $tmpfile <<EOF
960 cd dot
961 ls
962 quit
963 EOF
964     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/widelinks_share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
965     eval echo "$cmd"
966     out=`eval $cmd`
967     ret=$?
968     rm -f $tmpfile
969
970     if [ $ret != 0 ] ; then
971         echo "$out"
972         echo "failed accessing widelinks_share with error $ret"
973         return 1
974     fi
975
976     echo "$out" | grep 'NT_STATUS'
977     ret=$?
978     if [ $ret = 0 ] ; then
979         echo "$out"
980         echo "failed - NT_STATUS_XXXX listing \\widelinks_share\\dot"
981         return 1
982     fi
983
984     cat > $tmpfile <<EOF
985 allinfo source
986 quit
987 EOF
988     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/widelinks_share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
989     eval echo "$cmd"
990     out=`eval $cmd`
991     ret=$?
992     rm -f $tmpfile
993
994     if [ $ret != 0 ] ; then
995         echo "$out"
996         echo "failed accessing widelinks_share with error $ret"
997         return 1
998     fi
999
1000 # This should fail with NT_STATUS_ACCESS_DENIED
1001     echo "$out" | grep 'NT_STATUS_ACCESS_DENIED'
1002     ret=$?
1003     if [ $ret != 0 ] ; then
1004         echo "$out"
1005         echo "failed - should get NT_STATUS_ACCESS_DENIED listing \\widelinks_share\\source"
1006         return 1
1007     fi
1008 }
1009
1010 # Test creating then deleting a stream file doesn't leave a lost-XXXXX directory.
1011 test_streams_depot_delete()
1012 {
1013     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1014     rm -rf "$LOCAL_PATH/lost-*"
1015
1016     cat > $tmpfile <<EOF
1017 put ${PREFIX}/smbclient_interactive_prompt_commands foo:bar
1018 del foo
1019 ls lost*
1020 quit
1021 EOF
1022     # This only works with SMB3?
1023     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS -mSMB3 < $tmpfile 2>&1'
1024     eval echo "$cmd"
1025     out=`eval $cmd`
1026     ret=$?
1027     rm -f $tmpfile
1028
1029     if [ $ret != 0 ] ; then
1030         echo "$out"
1031         echo "failed creating then deleting foo:bar with error $ret"
1032         return 1
1033     fi
1034
1035     echo "$out" | grep 'NT_STATUS_NO_SUCH_FILE listing \\lost\*'
1036     ret=$?
1037     if [ $ret != 0 ] ; then
1038         echo "$out"
1039         echo "deleting foo:bar left lost-XXX directory"
1040         rm -rf "$LOCAL_PATH/lost-*"
1041         return 1
1042     fi
1043 }
1044
1045 # Test follow symlinks can't access symlinks
1046 test_nosymlinks()
1047 {
1048 # Setup test dirs.
1049     local_test_dir="$LOCAL_PATH/nosymlinks/test"
1050     local_slink_name="$local_test_dir/source"
1051     local_slink_target="$local_test_dir/nosymlink_target_file"
1052
1053     share_test_dir="test"
1054     share_foo_dir="$share_test_dir/foo"
1055     share_foobar_dir="$share_test_dir/foo/bar"
1056     share_target_file="$share_test_dir/foo/bar/testfile"
1057
1058     rm -rf $local_test_dir
1059
1060     local_nosymlink_target_file="nosymlink_target_file"
1061     echo "$local_slink_target" > $local_nosymlink_target_file
1062
1063     local_foobar_target_file="testfile"
1064     echo "$share_target_file" > $local_foobar_target_file
1065
1066     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1067     cat > $tmpfile <<EOF
1068 mkdir $share_test_dir
1069 mkdir $share_foo_dir
1070 mkdir $share_foobar_dir
1071 cd /$share_test_dir
1072 put $local_nosymlink_target_file
1073 cd /$share_foobar_dir
1074 put $local_foobar_target_file
1075 quit
1076 EOF
1077
1078     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/nosymlinks -I $SERVER_IP $LOCAL_ADDARGS < $tmpfile 2>&1'
1079     eval echo "$cmd"
1080     out=`eval $cmd`
1081     ret=$?
1082     rm -f $tmpfile
1083     rm -f $local_nosymlink_target_file
1084     rm -f $local_foobar_target_file
1085
1086     if [ $ret -ne 0 ] ; then
1087        echo "$out"
1088        echo "failed accessing local_symlinks with error $ret"
1089        false
1090        return
1091     fi
1092
1093     echo "$out" | grep 'NT_STATUS_'
1094     ret=$?
1095     if [ $ret -eq 0 ] ; then
1096        echo "$out"
1097        echo "failed - got an NT_STATUS error"
1098        false
1099        return
1100     fi
1101
1102 # Create the symlink locally
1103     ln -s $local_slink_target $local_slink_name
1104
1105 # Getting a file through a symlink name should fail.
1106     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1107     cat > $tmpfile <<EOF
1108 get test\\source
1109 quit
1110 EOF
1111     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/nosymlinks -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1112     eval echo "$cmd"
1113     out=`eval $cmd`
1114     ret=$?
1115     rm -f $tmpfile
1116
1117     if [ $ret -ne 0 ] ; then
1118        echo "$out"
1119        echo "failed accessing nosymlinks with error $ret"
1120        return 1
1121     fi
1122
1123     echo "$out" | grep 'NT_STATUS_ACCESS_DENIED'
1124     ret=$?
1125     if [ $ret -ne 0 ] ; then
1126        echo "$out"
1127        echo "failed - should get NT_STATUS_ACCESS_DENIED getting \\nosymlinks\\source"
1128        return 1
1129     fi
1130
1131 # But we should be able to create and delete directories.
1132     cat > $tmpfile <<EOF
1133 mkdir test\\a
1134 mkdir test\\a\\b
1135 quit
1136 EOF
1137     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/nosymlinks -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1138     eval echo "$cmd"
1139     out=`eval $cmd`
1140     ret=$?
1141     rm -f $tmpfile
1142
1143     if [ $ret -ne 0 ] ; then
1144        echo "$out"
1145        echo "failed accessing nosymlinks with error $ret"
1146        return 1
1147     fi
1148
1149     echo "$out" | grep 'NT_STATUS'
1150     ret=$?
1151     if [ $ret -eq 0 ] ; then
1152         echo "$out"
1153         echo "failed - NT_STATUS_XXXX doing mkdir a; mkdir a\\b on \\nosymlinks"
1154         return 1
1155     fi
1156
1157 # Ensure regular file/directory access also works.
1158     cat > $tmpfile <<EOF
1159 cd test\\foo\\bar
1160 ls
1161 get testfile -
1162 quit
1163 EOF
1164     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/nosymlinks -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1165     eval echo "$cmd"
1166     out=`eval $cmd`
1167     ret=$?
1168     rm -f $tmpfile
1169
1170     if [ $ret -ne 0 ] ; then
1171        echo "$out"
1172        echo "failed accessing nosymlinks with error $ret"
1173        return 1
1174     fi
1175
1176     echo "$out" | grep 'NT_STATUS'
1177     ret=$?
1178     if [ $ret -eq 0 ] ; then
1179        echo "$out"
1180        echo "failed - NT_STATUS_XXXX doing cd foo\\bar; get testfile on \\nosymlinks"
1181        return 1
1182     fi
1183
1184 # CLEANUP
1185     rm -f $local_slink_name
1186
1187     cat > $tmpfile <<EOF
1188 deltree test
1189 quit
1190 EOF
1191     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/nosymlinks -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1192     eval echo "$cmd"
1193     out=`eval $cmd`
1194     ret=$?
1195     rm -f $tmpfile
1196
1197     if [ $ret -ne 0 ] ; then
1198        echo "$out"
1199        echo "failed accessing nosymlinks with error $ret"
1200        return 1
1201     fi
1202
1203     echo "$out" | grep 'NT_STATUS'
1204     ret=$?
1205     if [ $ret -eq 0 ] ; then
1206        echo "$out"
1207        echo "failed - NT_STATUS_XXXX doing cd foo\\bar; get testfile on \\nosymlinks"
1208        return 1
1209     fi
1210 }
1211
1212 # Test we can follow normal symlinks.
1213 # Bug: https://bugzilla.samba.org/show_bug.cgi?id=12860
1214 # Note - this needs to be tested over SMB3, not SMB1.
1215
1216 test_local_symlinks()
1217 {
1218 # Setup test dirs.
1219     LOCAL_RAWARGS="${CONFIGURATION} -mSMB3"
1220     LOCAL_ADDARGS="${LOCAL_RAWARGS} $*"
1221
1222     share_test_dir="test"
1223     share_slink_target_dir="$share_test_dir/dir1"
1224
1225     local_test_dir="$LOCAL_PATH/local_symlinks/$share_test_dir"
1226     local_slink_name="$local_test_dir/sym_name"
1227     local_slink_target_dir="$local_test_dir/dir1"
1228
1229     rm -rf $local_test_dir
1230
1231 # Create the initial directories
1232     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1233     cat > $tmpfile <<EOF
1234 mkdir $share_test_dir
1235 mkdir $share_slink_target_dir
1236 quit
1237 EOF
1238
1239     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/local_symlinks -I $SERVER_IP $LOCAL_ADDARGS < $tmpfile 2>&1'
1240     eval echo "$cmd"
1241     out=`eval $cmd`
1242     ret=$?
1243     rm -f $tmpfile
1244
1245     if [ $ret -ne 0 ] ; then
1246        echo "$out"
1247        echo "failed accessing local_symlinks with error $ret"
1248        false
1249        return
1250     fi
1251
1252     echo "$out" | grep 'NT_STATUS_'
1253     ret=$?
1254     if [ $ret -eq 0 ] ; then
1255        echo "$out"
1256        echo "failed - got an NT_STATUS error"
1257        false
1258        return
1259     fi
1260
1261 # Create the symlink locally
1262     ln -s $local_slink_target_dir $local_slink_name
1263     ret=$?
1264     if [ $ret -ne 0 ] ; then
1265        echo "$out"
1266        echo "failed - unable to create symlink"
1267        ls -la $local_test_dir
1268        false
1269        return
1270     fi
1271
1272 # Can we cd into the symlink name and ls ?
1273     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1274     cat > $tmpfile <<EOF
1275 cd $share_test_dir\\sym_name
1276 ls
1277 quit
1278 EOF
1279     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/local_symlinks -I $SERVER_IP $LOCAL_ADDARGS < $tmpfile 2>&1'
1280     eval echo "$cmd"
1281     out=`eval $cmd`
1282     ret=$?
1283     rm -f $tmpfile
1284
1285     if [ $ret -ne 0 ] ; then
1286        echo "$out"
1287        echo "failed accessing local_symlinks with error $ret"
1288        false
1289        return
1290     fi
1291
1292     echo "$out" | grep 'NT_STATUS_'
1293     ret=$?
1294     if [ $ret -eq 0 ] ; then
1295        echo "$out"
1296        echo "failed - got an NT_STATUS error"
1297        false
1298        return
1299     fi
1300
1301 # CLEANUP
1302     rm -f $local_slink_name
1303
1304     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1305     cat > $tmpfile <<EOF
1306 deltree $share_test_dir
1307 quit
1308 EOF
1309     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/local_symlinks -I $SERVER_IP $LOCAL_ADDARGS < $tmpfile 2>&1'
1310     eval echo "$cmd"
1311     out=`eval $cmd`
1312     ret=$?
1313     rm -f $tmpfile
1314
1315     if [ $ret -ne 0 ] ; then
1316        echo "$out"
1317        echo "failed accessing local_symlinks with error $ret"
1318        false
1319        return
1320     fi
1321
1322     echo "$out" | grep 'NT_STATUS_'
1323     ret=$?
1324     if [ $ret -eq 0 ] ; then
1325        echo "$out"
1326        echo "failed - got an NT_STATUS error"
1327        false
1328        return
1329     fi
1330 }
1331
1332 # Test smbclient deltree command
1333 test_deltree()
1334 {
1335     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1336     deltree_dir=$PREFIX/deltree_dir
1337
1338     rm -rf $deltree_dir
1339     cat > $tmpfile <<EOF
1340 mkdir deltree_dir
1341 mkdir deltree_dir/foo
1342 mkdir deltree_dir/foo/bar
1343 put ${SMBCLIENT} deltree_dir/foo/bar/client
1344 deltree deltree_dir
1345 quit
1346 EOF
1347     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1348     eval echo "$cmd"
1349     out=`eval $cmd`
1350     ret=$?
1351
1352     if [ $ret != 0 ] ; then
1353         echo "$out"
1354         echo "failed deltree test with output $ret"
1355         false
1356         return
1357     fi
1358
1359     echo "$out" | grep 'NT_STATUS_'
1360     ret=$?
1361     if [ $ret -eq 0 ] ; then
1362        echo "$out"
1363        echo "failed - got an NT_STATUS error"
1364        false
1365        return
1366     fi
1367
1368     if [ -d $deltree_dir ] ; then
1369         echo "deltree did not delete everything"
1370         false
1371         return
1372     fi
1373 }
1374
1375 # Test smbclient setmode command
1376 test_setmode()
1377 {
1378     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1379
1380     cat > $tmpfile <<EOF
1381 del test_setmode
1382 put ${SMBCLIENT} test_setmode
1383 setmode test_setmode +r +s +h +a
1384 allinfo test_setmode
1385 setmode test_setmode -rsha
1386 allinfo test_setmode
1387 del test_setmode
1388 quit
1389 EOF
1390     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1391     eval echo "$cmd"
1392     out=`eval $cmd`
1393     ret=$?
1394
1395     if [ $ret != 0 ] ; then
1396         echo "$out"
1397         echo "failed setmode test with output $ret"
1398         false
1399         return
1400     fi
1401
1402     echo "$out" | grep 'attributes: RHSA'
1403     ret=$?
1404     if [ $ret -ne 0 ] ; then
1405        echo "$out"
1406        echo "failed - should get attributes: RHSA"
1407        false
1408        return
1409     fi
1410
1411     echo "$out" | grep 'attributes:  (80)'
1412     ret=$?
1413     if [ $ret -ne 0 ] ; then
1414        echo "$out"
1415        echo "failed - should also get attributes:  (80)"
1416        false
1417        return
1418     fi
1419 }
1420
1421 # Test smbclient utimes command
1422 test_utimes()
1423 {
1424     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1425
1426     saved_TZ="$TZ"
1427     TZ=UTC
1428     export TZ
1429     saved_LANG="$LANG"
1430     LANG=C
1431     export LANG
1432
1433     cat > $tmpfile <<EOF
1434 del utimes_test
1435 put ${SMBCLIENT} utimes_test
1436 allinfo utimes_test
1437 utimes utimes_test -1 17:01:01-05:10:20 -1 -1
1438 allinfo utimes_test
1439 del utimes_test
1440 quit
1441 EOF
1442     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1443     eval echo "$cmd"
1444     out=`eval $cmd`
1445     ret=$?
1446
1447     if [ -n "$saved_TZ" ] ; then
1448         export TZ="$saved_TZ"
1449     else
1450         unset TZ
1451     fi
1452     if [ -n "$saved_LANG" ] ; then
1453         export LANG="$saved_LANG"
1454     else
1455         unset LANG
1456     fi
1457
1458     if [ $ret != 0 ] ; then
1459         echo "$out"
1460         echo "failed utimes test with output $ret"
1461         false
1462         return
1463     fi
1464
1465     # Now, we should have 2 identical create_time, write_time, change_time
1466     # values, but one access_time of Jan  1 05:10:20 AM.
1467     out_sorted=`echo "$out" | sort | uniq`
1468     num_create=`echo "$out_sorted" | grep -c 'create_time:'`
1469     num_access=`echo "$out_sorted" | grep -c 'access_time:'`
1470     num_write=`echo "$out_sorted" | grep -c 'write_time:'`
1471     num_change=`echo "$out_sorted" | grep -c 'change_time:'`
1472     if [ "$num_create" != "1" ]; then
1473         echo "failed - should only get one create_time $out"
1474         false
1475         return
1476     fi
1477     if [ "$num_access" != "2" ]; then
1478         echo "failed - should get two access_time $out"
1479         false
1480         return
1481     fi
1482     if [ "$num_write" != "1" ]; then
1483         echo "failed - should only get one write_time $out"
1484         false
1485         return
1486     fi
1487     if [ "$num_change" != "1" ]; then
1488         echo "failed - should only get one change_time $out"
1489         false
1490         return
1491     fi
1492
1493     # This could be: Sun Jan  1 05:10:20 AM 2017
1494     # or           : Sun Jan  1 05:10:20 2017 CET
1495     echo "$out" | grep 'access_time:.*Sun Jan.*1 05:10:20 .*2017.*'
1496     ret=$?
1497     if [ $ret -ne 0 ] ; then
1498        echo "$out"
1499        echo
1500        echo "failed - should get access_time:    Sun Jan  1 05:10:20 [AM] 2017"
1501        false
1502        return
1503     fi
1504 }
1505
1506 # Test smbclient renames with pathnames containing '..'
1507 test_rename_dotdot()
1508 {
1509     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1510
1511     cat > $tmpfile <<EOF
1512 deltree dotdot_test
1513 mkdir dotdot_test
1514 cd dotdot_test
1515 mkdir dir1
1516 mkdir dir2
1517 cd dir1
1518 put ${SMBCLIENT} README
1519 rename README ..\\dir2\\README
1520 cd ..
1521 cd dir2
1522 allinfo README
1523 cd \\
1524 deltree dotdot_test
1525 quit
1526 EOF
1527     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1528     eval echo "$cmd"
1529     out=`eval $cmd`
1530     ret=$?
1531
1532     if [ $ret != 0 ] ; then
1533         echo "$out"
1534         echo "failed rename_dotdot test with output $ret"
1535         false
1536         return
1537     fi
1538
1539     # We are allowed to get NT_STATUS_NO_SUCH_FILE listing \dotdot_test
1540     # as the top level directory should not exist, but no other errors.
1541
1542     error_str=`echo $out | grep NT_STATUS | grep -v "NT_STATUS_NO_SUCH_FILE listing .dotdot_test"`
1543     if [ "$error_str" != "" ]; then
1544         echo "failed - unexpected NT_STATUS error in $out"
1545         false
1546         return
1547     fi
1548 }
1549
1550 # Test doing a volume command.
1551 test_volume()
1552 {
1553     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1554     cat > $tmpfile <<EOF
1555 volume
1556 quit
1557 EOF
1558     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1559     eval echo "$cmd"
1560     out=`eval $cmd`
1561     ret=$?
1562     rm -f $tmpfile
1563
1564     if [ $ret != 0 ] ; then
1565         echo "$out"
1566         echo "failed doing volume command with error $ret"
1567         return 1
1568     fi
1569
1570     echo "$out" | grep '^Volume: |tmp| serial number'
1571     ret=$?
1572     if [ $ret != 0 ] ; then
1573         echo "$out"
1574         echo "failed doing volume command"
1575         return 1
1576     fi
1577 }
1578
1579 test_server_os_message()
1580 {
1581     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1582     cat > $tmpfile <<EOF
1583 ls
1584 quit
1585 EOF
1586     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1587     eval echo "$cmd"
1588     out=`eval $cmd`
1589     ret=$?
1590     rm -f $tmpfile
1591
1592     if [ $ret -ne 0 ] ; then
1593        echo "$out"
1594        echo "failed to connect error $ret"
1595        return 1
1596     fi
1597
1598     echo "$out" | grep 'Try "help" to get a list of possible commands.'
1599     ret=$?
1600     if [ $ret -ne 0 ] ; then
1601        echo "$out"
1602        echo 'failed - should get: Try "help" to get a list of possible commands.'
1603        return 1
1604     fi
1605
1606     return 0
1607 }
1608
1609 # Test xattr_stream correctly reports mode.
1610 # BUG: https://bugzilla.samba.org/show_bug.cgi?id=13380
1611
1612 test_stream_directory_xattr()
1613 {
1614     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
1615 #
1616 # Test against streams_xattr
1617 #
1618     cat > $tmpfile <<EOF
1619 deltree foo
1620 mkdir foo
1621 put ${PREFIX}/smbclient_interactive_prompt_commands foo:bar
1622 setmode foo -a
1623 allinfo foo:bar
1624 deltree foo
1625 quit
1626 EOF
1627     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/streams_xattr -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1628     eval echo "$cmd"
1629     out=`eval $cmd`
1630     ret=$?
1631     rm -f $tmpfile
1632
1633     if [ $ret != 0 ] ; then
1634         echo "$out"
1635         echo "failed checking attributes on xattr stream foo:bar with error $ret"
1636         return 1
1637     fi
1638
1639     echo "$out" | grep "attributes:.*80"
1640     ret=$?
1641     if [ $ret != 0 ] ; then
1642         echo "$out"
1643         echo "failed checking attributes on xattr stream foo:bar"
1644         return 1
1645     fi
1646
1647 #
1648 # Test against streams_depot
1649 #
1650     cat > $tmpfile <<EOF
1651 deltree foo
1652 mkdir foo
1653 put ${PREFIX}/smbclient_interactive_prompt_commands foo:bar
1654 setmode foo -a
1655 allinfo foo:bar
1656 deltree foo
1657 quit
1658 EOF
1659     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
1660     eval echo "$cmd"
1661     out=`eval $cmd`
1662     ret=$?
1663     rm -f $tmpfile
1664
1665     if [ $ret != 0 ] ; then
1666         echo "$out"
1667         echo "failed checking attributes on depot stream foo:bar with error $ret"
1668         return 1
1669     fi
1670
1671     echo "$out" | grep "attributes:.*80"
1672     ret=$?
1673     if [ $ret != 0 ] ; then
1674         echo "$out"
1675         echo "failed checking attributes on depot stream foo:bar"
1676         return 1
1677     fi
1678 }
1679
1680 #
1681 LOGDIR_PREFIX=test_smbclient_s3
1682
1683 # possibly remove old logdirs:
1684
1685 for OLDDIR in $(find ${PREFIX} -type d -name "${LOGDIR_PREFIX}_*") ;  do
1686         echo "removing old directory ${OLDDIR}"
1687         rm -rf ${OLDDIR}
1688 done
1689
1690 LOGDIR=$(mktemp -d ${PREFIX}/${LOGDIR_PREFIX}_XXXXXX)
1691
1692
1693 testit "smbclient -L $SERVER_IP" $SMBCLIENT -L $SERVER_IP -N -p 139 ${RAWARGS} || failed=`expr $failed + 1`
1694 testit "smbclient -L $SERVER -I $SERVER_IP" $SMBCLIENT -L $SERVER -I $SERVER_IP -N -p 139 ${RAWARGS} -c quit || failed=`expr $failed + 1`
1695
1696 testit "noninteractive smbclient does not prompt" \
1697     test_noninteractive_no_prompt || \
1698     failed=`expr $failed + 1`
1699
1700 testit "noninteractive smbclient -l does not prompt" \
1701    test_noninteractive_no_prompt -l $LOGDIR || \
1702     failed=`expr $failed + 1`
1703
1704 testit "interactive smbclient prompts on stdout" \
1705    test_interactive_prompt_stdout || \
1706     failed=`expr $failed + 1`
1707
1708 testit "interactive smbclient -l prompts on stdout" \
1709    test_interactive_prompt_stdout -l $LOGDIR || \
1710     failed=`expr $failed + 1`
1711
1712 testit "creating a bad symlink and deleting it" \
1713    test_bad_symlink || \
1714    failed=`expr $failed + 1`
1715
1716 testit "creating a good symlink and deleting it by path" \
1717    test_good_symlink || \
1718    failed=`expr $failed + 1`
1719
1720 testit "writing into a read-only directory fails" \
1721    test_read_only_dir ro-tmp || \
1722    failed=`expr $failed + 1`
1723
1724 testit "writing into a read-only share fails" \
1725    test_read_only_dir valid-users-tmp || \
1726    failed=`expr $failed + 1`
1727
1728 testit "Reading a owner-only file fails" \
1729    test_owner_only_file || \
1730    failed=`expr $failed + 1`
1731
1732 testit "Accessing an MS-DFS link" \
1733    test_msdfs_link || \
1734    failed=`expr $failed + 1`
1735
1736 testit "Ensure archive bit is set correctly on file/dir rename" \
1737     test_rename_archive_bit || \
1738     failed=`expr $failed + 1`
1739
1740 testit "ccache access works for smbclient" \
1741     test_ccache_access || \
1742     failed=`expr $failed + 1`
1743
1744 testit "sending a message to the remote server" \
1745     test_message || \
1746     failed=`expr $failed + 1`
1747
1748 testit "using an authentication file" \
1749     test_auth_file || \
1750     failed=`expr $failed + 1`
1751
1752 testit "list with backup privilege" \
1753     test_backup_privilege_list || \
1754     failed=`expr $failed + 1`
1755
1756 testit "list a share with bad names (won't convert)" \
1757     test_bad_names || \
1758     failed=`expr $failed + 1`
1759
1760 testit "list a share with a mangled name + acl_xattr object" \
1761     test_mangled_names || \
1762     failed=`expr $failed + 1`
1763
1764 testit "server-side file copy" \
1765     test_scopy || \
1766     failed=`expr $failed + 1`
1767
1768 testit "creating a :stream at root of share" \
1769     test_toplevel_stream || \
1770     failed=`expr $failed + 1`
1771
1772 testit "Ensure widelinks are restricted" \
1773     test_widelinks || \
1774     failed=`expr $failed + 1`
1775
1776 testit "streams_depot can delete correctly" \
1777     test_streams_depot_delete || \
1778     failed=`expr $failed + 1`
1779
1780 testit "stream_xattr attributes" \
1781     test_stream_directory_xattr || \
1782     failed=`expr $failed + 1`
1783
1784 testit "follow symlinks = no" \
1785     test_nosymlinks || \
1786     failed=`expr $failed + 1`
1787
1788 testit "follow local symlinks" \
1789     test_local_symlinks || \
1790     failed=`expr $failed + 1`
1791
1792 testit "smbclient deltree command" \
1793     test_deltree || \
1794     failed=`expr $failed + 1`
1795
1796 testit "server os message" \
1797     test_server_os_message || \
1798     failed=`expr $failed + 1`
1799
1800 testit "setmode test" \
1801     test_setmode || \
1802     failed=`expr $failed + 1`
1803
1804 testit "utimes" \
1805     test_utimes || \
1806     failed=`expr $failed + 1`
1807
1808 testit "rename_dotdot" \
1809     test_rename_dotdot || \
1810     failed=`expr $failed + 1`
1811
1812 testit "volume" \
1813     test_volume || \
1814     failed=`expr $failed + 1`
1815
1816 testit "rm -rf $LOGDIR" \
1817     rm -rf $LOGDIR || \
1818     failed=`expr $failed + 1`
1819
1820 testok $0 $failed