s3-selftest Remove more instances of /tmp in test_smbclient_s3.sh
[sfrench/samba-autobuild/.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 USERNAME PASSWORD USERID LOCAL_PATH PREFIX
8 EOF
9 exit 1;
10 fi
11
12 SERVER="$1"
13 SERVER_IP="$2"
14 USERNAME="$3"
15 PASSWORD="$4"
16 USERID="$5"
17 LOCAL_PATH="$6"
18 PREFIX="$7"
19 SMBCLIENT="$VALGRIND ${SMBCLIENT:-$BINDIR/smbclient}"
20 WBINFO="$VALGRIND ${WBINFO:-$BINDIR/wbinfo}"
21 shift 7
22 ADDARGS="$*"
23
24 incdir=`dirname $0`/../../../testprogs/blackbox
25 . $incdir/subunit.sh
26
27 failed=0
28
29 # Test that a noninteractive smbclient does not prompt
30 test_noninteractive_no_prompt()
31 {
32     prompt="smb"
33
34     cmd='echo du | $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS 2>&1'
35     eval echo "$cmd"
36     out=`eval $cmd`
37
38     if [ $? != 0 ] ; then
39         echo "$out"
40         echo "command failed"
41         false
42         return
43     fi
44
45     echo "$out" | grep $prompt >/dev/null 2>&1
46
47     if [ $? = 0 ] ; then
48         # got a prompt .. fail
49         echo matched interactive prompt in non-interactive mode
50         false
51     else
52         true
53     fi
54 }
55
56 # Test that an interactive smbclient prompts to stdout
57 test_interactive_prompt_stdout()
58 {
59     prompt="smb"
60     tmpfile=$PREFIX/smbclient_interactive_prompt_commands
61
62     cat > $tmpfile <<EOF
63 du
64 quit
65 EOF
66
67     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
68     eval echo "$cmd"
69     out=`eval $cmd`
70     ret=$?
71     rm -f $tmpfile
72
73     if [ $ret != 0 ] ; then
74         echo "$out"
75         echo "command failed"
76         false
77         return
78     fi
79
80     echo "$out" | grep $prompt >/dev/null 2>&1
81
82     if [ $? = 0 ] ; then
83         # got a prompt .. succeed
84         true
85     else
86         echo failed to match interactive prompt on stdout
87         false
88     fi
89 }
90
91 # Test creating a bad symlink and deleting it.
92 test_bad_symlink()
93 {
94     prompt="posix_unlink deleted file /newname"
95     tmpfile=$PREFIX/smbclient_bad_symlinks_commands
96
97     cat > $tmpfile <<EOF
98 posix
99 posix_unlink newname
100 symlink badname newname
101 posix_unlink newname
102 quit
103 EOF
104
105     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
106     eval echo "$cmd"
107     out=`eval $cmd`
108     ret=$?
109     rm -f $tmpfile
110
111     if [ $ret != 0 ] ; then
112         echo "$out"
113         echo "failed create then delete bad symlink with error $ret"
114         false
115         return
116     fi
117
118     echo "$out" | grep "$prompt" >/dev/null 2>&1
119
120     ret=$?
121     if [ $ret = 0 ] ; then
122         # got the correct prompt .. succeed
123         true
124     else
125         echo "$out"
126         echo "failed create then delete bad symlink - grep failed with $ret"
127         false
128     fi
129 }
130
131 # Test creating a good symlink and deleting it by path.
132 test_good_symlink()
133 {
134     tmpfile=$PREFIX/smbclient.in.$$
135     slink_name="$LOCAL_PATH/slink"
136     slink_target="$LOCAL_PATH/slink_target"
137
138     touch $slink_target
139     ln -s $slink_target $slink_name
140     cat > $tmpfile <<EOF
141 del slink
142 quit
143 EOF
144
145     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
146     eval echo "$cmd"
147     out=`eval $cmd`
148     ret=$?
149     rm -f $tmpfile
150
151     if [ $ret != 0 ] ; then
152         echo "$out"
153         echo "failed delete good symlink with error $ret"
154         rm $slink_target
155         rm $slink_name
156         false
157         return
158     fi
159
160     if [ ! -e $slink_target ] ; then
161         echo "failed delete good symlink - symlink target deleted !"
162         rm $slink_target
163         rm $slink_name
164         false
165         return
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         false
173     else
174         # got the correct prompt .. succeed
175         rm $slink_target
176         true
177     fi
178 }
179
180 # Test writing into a read-only directory (logon as guest) fails.
181 test_read_only_dir()
182 {
183     prompt="NT_STATUS_ACCESS_DENIED making remote directory"
184     tmpfile=$PREFIX/smbclient.in.$$
185
186 ##
187 ## We can't do this as non-root. We always have rights to
188 ## create the directory.
189 ##
190     if [ "$USERID" != 0 ] ; then
191         echo "skipping test_read_only_dir as non-root"
192         true
193         return
194     fi
195
196 ##
197 ## We can't do this with an encrypted connection. No credentials
198 ## to set up the channel.
199 ##
200     if [ "$ADDARGS" = "-e" ] ; then
201         echo "skipping test_read_only_dir with encrypted connection"
202         true
203         return
204     fi
205
206     cat > $tmpfile <<EOF
207 mkdir a_test_dir
208 quit
209 EOF
210
211     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U% //$SERVER/ro-tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
212     eval echo "$cmd"
213     out=`eval $cmd`
214     ret=$?
215     rm -f $tmpfile
216
217     if [ $ret != 0 ] ; then
218         echo "$out"
219         echo "failed writing into read-only directory with error $ret"
220         false
221         return
222     fi
223
224     echo "$out" | grep "$prompt" >/dev/null 2>&1
225
226     ret=$?
227     if [ $ret = 0 ] ; then
228         # got the correct prompt .. succeed
229         true
230     else
231         echo "$out"
232         echo "failed writing into read-only directory - grep failed with $ret"
233         false
234     fi
235 }
236
237 # Test reading an owner-only file (logon as guest) fails.
238 test_owner_only_file()
239 {
240     prompt="NT_STATUS_ACCESS_DENIED opening remote file"
241     tmpfile=$PREFIX/smbclient.in.$$
242
243 ##
244 ## We can't do this as non-root. We always have rights to
245 ## read the file.
246 ##
247     if [ "$USERID" != 0 ] ; then
248         echo "skipping test_owner_only_file as non-root"
249         true
250         return
251     fi
252
253 ##
254 ## We can't do this with an encrypted connection. No credentials
255 ## to set up the channel.
256 ##
257     if [ "$ADDARGS" = "-e" ] ; then
258         echo "skipping test_owner_only_file with encrypted connection"
259         true
260         return
261     fi
262
263     cat > $tmpfile <<EOF
264 get unreadable_file
265 quit
266 EOF
267
268     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U% //$SERVER/ro-tmp -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
269     eval echo "$cmd"
270     out=`eval $cmd`
271     ret=$?
272     rm -f $tmpfile
273
274     if [ $ret != 0 ] ; then
275         echo "$out"
276         echo "failed reading owner-only file with error $ret"
277         false
278         return
279     fi
280
281     echo "$out" | grep "$prompt" >/dev/null 2>&1
282
283     ret=$?
284     if [ $ret = 0 ] ; then
285         # got the correct prompt .. succeed
286         true
287     else
288         echo "$out"
289         echo "failed reading owner-only file - grep failed with $ret"
290         false
291     fi
292 }
293
294 # Test accessing an msdfs path.
295 test_msdfs_link()
296 {
297     tmpfile=$PREFIX/smbclient.in.$$
298     prompt="  msdfs-target  "
299
300     cat > $tmpfile <<EOF
301 ls
302 cd \\msdfs-src1
303 ls msdfs-target
304 quit
305 EOF
306
307     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
308     eval echo "$cmd"
309     out=`eval $cmd`
310     ret=$?
311     rm -f $tmpfile
312
313     if [ $ret != 0 ] ; then
314         echo "$out"
315         echo "failed accessing \\msdfs-src1 link with error $ret"
316         false
317         return
318     fi
319
320     echo "$out" | grep "$prompt" >/dev/null 2>&1
321
322     ret=$?
323     if [ $ret != 0 ] ; then
324         echo "$out"
325         echo "failed listing \\msdfs-src1 - grep failed with $ret"
326         false
327     fi
328
329     cat > $tmpfile <<EOF
330 ls
331 cd \\deeppath\\msdfs-src2
332 ls msdfs-target
333 quit
334 EOF
335
336     cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS < $tmpfile 2>&1'
337     eval echo "$cmd"
338     out=`eval $cmd`
339     ret=$?
340     rm -f $tmpfile
341
342     if [ $ret != 0 ] ; then
343         echo "$out"
344         echo "failed accessing \\deeppath\\msdfs-src2 link with error $ret"
345         false
346         return
347     fi
348
349     echo "$out" | grep "$prompt" >/dev/null 2>&1
350
351     ret=$?
352     if [ $ret != 0 ] ; then
353         echo "$out"
354         echo "failed listing \\deeppath\\msdfs-src2 - grep failed with $ret"
355         false
356         return
357     else
358         true
359         return
360     fi
361 }
362
363 # Test authenticating using the winbind ccache
364 test_ccache_access()
365 {
366     $WBINFO --ccache-save="${USERNAME}%${PASSWORD}"
367     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \
368         -c quit 2>&1
369     ret=$?
370
371     if [ $ret != 0 ] ; then
372         echo "smbclient failed to use cached credentials"
373         false
374         return
375     fi
376
377     $WBINFO --ccache-save="${USERNAME}%GarBage"
378     $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \
379         -c quit 2>&1
380     ret=$?
381
382     if [ $ret -eq 0 ] ; then
383         echo "smbclient succeeded with wrong cached credentials"
384         false
385         return
386     fi
387
388     $WBINFO --logoff
389 }
390
391 LOGDIR_PREFIX=test_smbclient_s3
392
393 # possibly remove old logdirs:
394
395 for OLDDIR in $(find ${PREFIX} -type d -name "${LOGDIR_PREFIX}_*") ;  do
396         echo "removing old directory ${OLDDIR}"
397         rm -rf ${OLDDIR}
398 done
399
400 LOGDIR=$(mktemp -d ${PREFIX}/${LOGDIR_PREFIX}_XXXX)
401
402
403 testit "smbclient -L $SERVER_IP" $SMBCLIENT -L $SERVER_IP -N -p 139 || failed=`expr $failed + 1`
404 testit "smbclient -L $SERVER -I $SERVER_IP" $SMBCLIENT -L $SERVER -I $SERVER_IP -N -p 139 -c quit || failed=`expr $failed + 1`
405
406 testit "noninteractive smbclient does not prompt" \
407     test_noninteractive_no_prompt || \
408     failed=`expr $failed + 1`
409
410 testit "noninteractive smbclient -l does not prompt" \
411    test_noninteractive_no_prompt -l $LOGDIR || \
412     failed=`expr $failed + 1`
413
414 testit "interactive smbclient prompts on stdout" \
415    test_interactive_prompt_stdout || \
416     failed=`expr $failed + 1`
417
418 testit "interactive smbclient -l prompts on stdout" \
419    test_interactive_prompt_stdout -l $LOGDIR || \
420     failed=`expr $failed + 1`
421
422 testit "creating a bad symlink and deleting it" \
423    test_bad_symlink || \
424    failed=`expr $failed + 1`
425
426 testit "creating a good symlink and deleting it by path" \
427    test_good_symlink || \
428    failed=`expr $failed + 1`
429
430 testit "writing into a read-only directory fails" \
431    test_read_only_dir || \
432    failed=`expr $failed + 1`
433
434 testit "Reading a owner-only file fails" \
435    test_owner_only_file || \
436    failed=`expr $failed + 1`
437
438 testit "Accessing an MS-DFS link" \
439    test_msdfs_link || \
440    failed=`expr $failed + 1`
441
442 testit "ccache access works for smbclient" \
443     test_ccache_access || \
444     failed=`expr $failed + 1`
445
446 testit "rm -rf $LOGDIR" \
447     rm -rf $LOGDIR || \
448     failed=`expr $failed + 1`
449
450 testok $0 $failed