Fix for https://bugzilla.samba.org/show_bug.cgi?id=9634
[samba.git] / source4 / setup / tests / provision_fileperms.sh
1 #!/bin/sh
2
3 if [ $# -lt 1 ]; then
4 cat <<EOF
5 Usage: $0 PREFIX
6 EOF
7 exit 1;
8 fi
9
10 PREFIX="$1"
11 shift 1
12
13 . `dirname $0`/../../../testprogs/blackbox/subunit.sh
14
15 # selftest sets the umask to zero. Explicitly set it to 022 here,
16 # which should mean files should never be writable for anyone else
17 ORIG_UMASK=`umask`
18 umask 0022
19
20 # checks that the files in the 'private' directory created are not
21 # world-writable
22 check_private_file_perms()
23 {
24     target_dir="$1/private"
25     result=0
26
27     for file in `ls $target_dir/`
28     do
29         filepath="$target_dir/$file"
30
31         # skip directories/sockets for now
32         if [ ! -f $filepath ] ; then
33             continue;
34         fi
35
36         # use stat to get the file permissions, i.e. -rw-------
37         file_perm=`stat -c "%A" $filepath`
38
39         # then use cut to drop the first 4 chars containing the file type
40         # and owner permissions. What's left is the group and other users
41         global_perm=`echo $file_perm | cut -c4-`
42
43         # check the remainder doesn't have write permissions set
44         if [ -z "${global_perm##*w*}" ] ; then
45             echo "Error: $file has $file_perm permissions"
46             result=1
47         fi
48     done
49     return $result
50 }
51
52 TARGET_DIR=$PREFIX/basic-dc
53 rm -rf $TARGET_DIR
54
55 # create a dummy smb.conf - we need to use fake ACLs for the file system here
56 # (but passing --option args with spaces in it proved too difficult in bash)
57 SMB_CONF=$TARGET_DIR/tmp/smb.conf
58 mkdir -p `dirname $SMB_CONF`
59 echo "vfs objects = fake_acls xattr_tdb" > $SMB_CONF
60
61 # provision a basic DC
62 testit "basic-provision" $PYTHON $BINDIR/samba-tool domain provision --server-role="dc" --domain=FOO --realm=foo.example.com --targetdir=$TARGET_DIR --configfile=$SMB_CONF
63
64 # check the file permissions in the 'private' directory really are private
65 testit "provision-fileperms" check_private_file_perms $TARGET_DIR
66
67 rm -rf $TARGET_DIR
68
69 umask $ORIG_UMASK
70
71 exit $failed