#!/bin/sh # this runs the file serving tests that are expected to pass with samba3 if [ $# -lt 13 ]; then cat </dev/null 2>&1 if [ $? = 0 ] ; then # got a prompt .. fail echo matched interactive prompt in non-interactive mode return 1 fi return 0 } # 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 echo failed to match interactive prompt on stdout return 1 fi return 0 } # 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 echo "$out" echo "failed create then delete bad symlink - grep failed with $ret" return 1 fi return 0 } # 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 echo "$out" echo "failed writing into read-only directory - grep failed with $ret" return 1 fi return 0 } # Test sending a message test_message() { tmpfile=$PREFIX/message_in.$$ cat > $tmpfile < $tmpfile </dev/null 2>&1 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed reading owner-only file - grep failed with $ret" return 1 fi return 0 } # Test accessing an msdfs path. test_msdfs_link() { tmpfile=$PREFIX/smbclient.in.$$ prompt=" msdfs-target " cmd='$SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/msdfs-share -I $SERVER_IP $ADDARGS -m nt1 -c dir 2>&1' out=`eval $cmd` ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing msfds-share\ with error $ret" return 1 fi cat > $tmpfile </dev/null 2>&1 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\msdfs-src1 - grep failed with $ret" return 1 fi cat > $tmpfile </dev/null 2>&1 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\deeppath\\msdfs-src2 - grep failed with $ret" return 1 fi return 0 } # 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 echo "$out" echo "Attributes incorrect on new file $ret" return 1 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 echo "$out" echo "Attributes incorrect on renamed file $ret" return 1 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 echo "$out" echo "Attributes incorrect on new directory $ret" return 1 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 echo "$out" echo "Attributes incorrect on renamed directory $ret" return 1 fi return 0 } # 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}')" return 1 fi $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}" $ADDARGS -c quit 2>&1 ret=$? if [ $ret != 0 ] ; then echo "smbclient failed to use cached credentials" return 1 fi $WBINFO --ccache-save="${USERNAME}%GarBage" ret=$? if [ $ret != 0 ] ; then echo "wbinfo failed to store creds in cache (user='${USERNAME}', pass='GarBage')" return 1 fi $SMBCLIENT //$SERVER_IP/tmp -C -U "${USERNAME}" $ADDARGS -c quit 2>&1 ret=$? if [ $ret -eq 0 ] ; then echo "smbclient succeeded with wrong cached credentials" return 1 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" return 1 fi cat > $tmpfile <&1 ret=$? rm $tmpfile if [ $ret -eq 0 ] ; then echo "smbclient succeeded with wrong auth file credentials" return 1 fi } # Test doing a directory listing with backup privilege. test_backup_privilege_list() { tmpfile=$PREFIX/smbclient_backup_privilege_list # selftest uses the forward slash as a separator, but "net sam rights # grant" requires the backslash separator USER_TMP=$(printf '%s' "$USERNAME" | tr '/' '\\') # If we don't have a DOMAIN component to the username, add it. printf '%s' "$USER_TMP" | grep '\\' 2>&1 ret=$? if [ $ret != 0 ] ; then priv_username="$DOMAIN\\$USER_TMP" else priv_username="$USER_TMP" 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" return 1 fi cat > $tmpfile <&1 ret=$? if [ $ret != 0 ] ; then echo "failed to remove SeBackupPrivilege from user $priv_username - $ret" return 1 fi } # Test accessing an share with bad names (won't convert). test_bad_names() { # First with SMB1 cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/badname-tmp -I $SERVER_IP $ADDARGS -mNT1 -c ls 2>&1' eval echo "$cmd" out=`eval $cmd` ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed accessing badname-tmp (SMB1) with error $ret" return 1 fi echo "$out" | wc -l 2>&1 | grep 5 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - grep of number of lines (1) failed with $ret" return 1 fi echo "$out" | grep '^ \. *D' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - grep (1) failed with $ret" return 1 fi echo "$out" | grep '^ \.\. *D' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - grep (2) failed with $ret" return 1 fi echo "$out" | grep '^ blank.txt *N' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - grep (3) failed with $ret" return 1 fi echo "$out" | grep '^ *$' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - grep (4) failed with $ret" return 1 fi echo "$out" | grep 'blocks of size.*blocks available' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - grep (5) failed with $ret" return 1 fi # Now check again with -mSMB3 cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD //$SERVER/badname-tmp -I $SERVER_IP $ADDARGS -mSMB3 -c ls 2>&1' eval echo "$cmd" out=`eval $cmd` ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed accessing badname-tmp (SMB3) with error $ret" return 1 fi echo "$out" | wc -l 2>&1 | grep 5 ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - SMB3 grep of number of lines (1) failed with $ret" return 1 fi echo "$out" | grep '^ \. *D' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - SMB3 grep (1) failed with $ret" return 1 fi echo "$out" | grep '^ \.\. *D' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - SMB3 grep (2) failed with $ret" return 1 fi echo "$out" | grep '^ blank.txt *N' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - SMB3 grep (3) failed with $ret" return 1 fi echo "$out" | grep '^ *$' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - SMB3 grep (4) failed with $ret" return 1 fi echo "$out" | grep 'blocks of size.*blocks available' ret=$? if [ $ret != 0 ] ; then echo "$out" echo "failed listing \\badname-tmp - SMB3 grep (5) failed with $ret" return 1 fi } # Test accessing an share with a name that must be mangled - with acl_xattrs. # We know foo:bar gets mangled to FF4GBY~Q with the default name-mangling algorithm (hash2). test_mangled_names() { tmpfile=$PREFIX/smbclient_interactive_prompt_commands cat > $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $local_nosymlink_target_file local_foobar_target_file="testfile" echo "$share_target_file" > $local_foobar_target_file tmpfile=$PREFIX/smbclient_interactive_prompt_commands cat > $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile < $tmpfile <