#!/bin/sh # this runs the file serving tests that are expected to pass with samba3 if [ $# -lt 11 ]; then cat </dev/null 2>&1 if [ $? = 0 ] ; then # got a prompt .. fail echo matched interactive prompt in non-interactive mode false else true fi } # Test that an interactive smbclient prompts to stdout test_interactive_prompt_stdout() { prompt="smb" tmpfile=$PREFIX/smbclient_interactive_prompt_commands cat > $tmpfile </dev/null 2>&1 if [ $? = 0 ] ; then # got a prompt .. succeed true else echo failed to match interactive prompt on stdout false fi } # Test creating a bad symlink and deleting it. test_bad_symlink() { prompt="posix_unlink deleted file /newname" tmpfile=$PREFIX/smbclient_bad_symlinks_commands cat > $tmpfile </dev/null 2>&1 ret=$? if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "failed create then delete bad symlink - grep failed with $ret" false fi } # Test creating a good symlink and deleting it by path. test_good_symlink() { tmpfile=$PREFIX/smbclient.in.$$ slink_name="$LOCAL_PATH/slink" slink_target="$LOCAL_PATH/slink_target" touch $slink_target ln -s $slink_target $slink_name cat > $tmpfile < $tmpfile </dev/null 2>&1 ret=$? if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "failed writing into read-only directory - grep failed with $ret" false fi } # Test sending a message test_message() { tmpfile=$PREFIX/message_in.$$ cat > $tmpfile < $tmpfile </dev/null 2>&1 ret=$? if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "failed reading owner-only file - grep failed with $ret" false fi } # Test accessing an msdfs path. test_msdfs_link() { tmpfile=$PREFIX/smbclient.in.$$ prompt=" msdfs-target " cat > $tmpfile </dev/null 2>&1 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\msdfs-src1 - grep failed with $ret" false fi cat > $tmpfile </dev/null 2>&1 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\deeppath\\msdfs-src2 - grep failed with $ret" false return else true return fi } # Archive bits are correctly set on file/dir creation and rename. test_rename_archive_bit() { prompt_file="attributes: A (20)" prompt_dir="attributes: D (10)" tmpfile="$PREFIX/smbclient.in.$$" filename="foo.$$" filename_ren="bar.$$" dirname="foodir.$$" dirname_ren="bardir.$$" filename_path="$PREFIX/$filename" local_name1="$LOCAL_PATH/$filename" local_name2="$LOCAL_PATH/$filename_ren" local_dir_name1="$LOCAL_PATH/$dirname" local_dir_name2="$LOCAL_PATH/$dirname_ren" rm -f $filename_path rm -f $local_name1 rm -f $local_name2 # Create a new file, ensure it has 'A' attributes. touch $filename_path cat > $tmpfile </dev/null 2>&1 ret=$? rm -f $filename_path rm -f $local_name1 rm -f $local_name2 if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "Attributes incorrect on new file $ret" false fi # Now check if we remove 'A' and rename, the A comes back. touch $filename_path cat > $tmpfile </dev/null 2>&1 ret=$? rm -f $filename_path rm -f $local_name1 rm -f $local_name2 if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "Attributes incorrect on renamed file $ret" false fi rm -rf $local_dir_name1 rm -rf $local_dir_name2 # Create a new directory, ensure it has 'D' but not 'A' attributes. cat > $tmpfile </dev/null 2>&1 ret=$? rm -rf $local_dir_name1 rm -rf $local_dir_name2 if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "Attributes incorrect on new directory $ret" false fi # Now check if we rename, we still only have 'D' attributes cat > $tmpfile </dev/null 2>&1 ret=$? rm -f $local_name1 rm -f $local_name2 if [ $ret = 0 ] ; then # got the correct prompt .. succeed true else echo "$out" echo "Attributes incorrect on renamed directory $ret" false fi } # Test authenticating using the winbind ccache test_ccache_access() { $WBINFO --ccache-save="${USERNAME}%${PASSWORD}" ret=$? if [ $ret != 0 ] ; then echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='${PASSWORD}')" false return fi $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \ -c quit 2>&1 ret=$? if [ $ret != 0 ] ; then echo "smbclient failed to use cached credentials" false return fi $WBINFO --ccache-save="${USERNAME}%GarBage" ret=$? if [ $ret != 0 ] ; then echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='GarBage')" false return fi $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}%" \ -c quit 2>&1 ret=$? if [ $ret -eq 0 ] ; then echo "smbclient succeeded with wrong cached credentials" false return fi $WBINFO --logoff } # Test authenticating using the winbind ccache test_auth_file() { tmpfile=$PREFIX/smbclient.in.$$ cat > $tmpfile <&1 ret=$? rm $tmpfile if [ $ret != 0 ] ; then echo "smbclient failed to use auth file" false return fi cat > $tmpfile <&1 ret=$? rm $tmpfile if [ $ret -eq 0 ] ; then echo "smbclient succeeded with wrong auth file credentials" false return fi } # Test doing a directory listing with backup privilege. test_backup_privilege_list() { tmpfile=$PREFIX/smbclient_backup_privilege_list # If we don't have a DOMAIN component to the username, add it. echo "$USERNAME" | grep '\\' 2>&1 ret=$? if [ $ret != 0 ] ; then priv_username="$DOMAIN\\$USERNAME" else priv_username=$USERNAME fi $NET sam rights grant $priv_username SeBackupPrivilege 2>&1 ret=$? if [ $ret != 0 ] ; then echo "Failed to add SeBackupPrivilege to user $priv_username - $ret" false return fi cat > $tmpfile <&1 ret=$? if [ $ret != 0 ] ; then echo "failed to remove SeBackupPrivilege from user $priv_username - $ret" false return fi } LOGDIR_PREFIX=test_smbclient_s3 # possibly remove old logdirs: for OLDDIR in $(find ${PREFIX} -type d -name "${LOGDIR_PREFIX}_*") ; do echo "removing old directory ${OLDDIR}" rm -rf ${OLDDIR} done LOGDIR=$(mktemp -d ${PREFIX}/${LOGDIR_PREFIX}_XXXXXX) testit "smbclient -L $SERVER_IP" $SMBCLIENT -L $SERVER_IP -N -p 139 || failed=`expr $failed + 1` testit "smbclient -L $SERVER -I $SERVER_IP" $SMBCLIENT -L $SERVER -I $SERVER_IP -N -p 139 -c quit || failed=`expr $failed + 1` testit "noninteractive smbclient does not prompt" \ test_noninteractive_no_prompt || \ failed=`expr $failed + 1` testit "noninteractive smbclient -l does not prompt" \ test_noninteractive_no_prompt -l $LOGDIR || \ failed=`expr $failed + 1` testit "interactive smbclient prompts on stdout" \ test_interactive_prompt_stdout || \ failed=`expr $failed + 1` testit "interactive smbclient -l prompts on stdout" \ test_interactive_prompt_stdout -l $LOGDIR || \ failed=`expr $failed + 1` testit "creating a bad symlink and deleting it" \ test_bad_symlink || \ failed=`expr $failed + 1` testit "creating a good symlink and deleting it by path" \ test_good_symlink || \ failed=`expr $failed + 1` testit "writing into a read-only directory fails" \ test_read_only_dir ro-tmp || \ failed=`expr $failed + 1` testit "writing into a read-only share fails" \ test_read_only_dir valid-users-tmp || \ failed=`expr $failed + 1` testit "Reading a owner-only file fails" \ test_owner_only_file || \ failed=`expr $failed + 1` testit "Accessing an MS-DFS link" \ test_msdfs_link || \ failed=`expr $failed + 1` testit "Ensure archive bit is set correctly on file/dir rename" \ test_rename_archive_bit || \ failed=`expr $failed + 1` testit "ccache access works for smbclient" \ test_ccache_access || \ failed=`expr $failed + 1` testit "sending a message to the remote server" \ test_message || \ failed=`expr $failed + 1` testit "using an authentication file" \ test_auth_file || \ failed=`expr $failed + 1` testit "list with backup privilege" \ test_backup_privilege_list || \ failed=`expr $failed + 1` testit "rm -rf $LOGDIR" \ rm -rf $LOGDIR || \ failed=`expr $failed + 1` testok $0 $failed