testsuite: Check file permissions
authorMartin Pitt <martin.pitt@ubuntu.com>
Wed, 12 May 2010 11:00:16 +0000 (13:00 +0200)
committerMartin Pitt <martin.pitt@ubuntu.com>
Wed, 12 May 2010 11:00:16 +0000 (13:00 +0200)
Add a check to the filesystem test cases for sane permissions of data files and
executables. In particular, this ensures that the executable bit is set where
it makes sense (directories and programs), but not on mere data files.

We currently ignore known-broken file systems like vfat and ntfs.

This is the groundwork to fix this behaviour at least on vfat. Its current
behaviour is quite unnerving, since trying to open a file on them in e. g.
GNOME will always ask for "do you want to open or run this file".

tests/run

index 1bd881a..acba8b1 100755 (executable)
--- a/tests/run
+++ b/tests/run
@@ -49,6 +49,10 @@ NUM_VDEV = 3 # number of virtual test devices that we need
 VDEV_SIZE = 60000000 # size of virtual test devices
 test_md_dev = '/dev/md125'
 
+# Those file systems are known to have a broken handling of permissions, in
+# particular the executable bit
+BROKEN_PERMISSIONS_FS = ['vfat', 'ntfs']
+
 # Some D-BUS API methods cause properties to not be up to date yet when a
 # method call finishes, thus we do an udevadm settle as a workaround. Those
 # methods should eventually get fixed properly, but it's unnerving to have
@@ -641,6 +645,8 @@ class FS(UDisksTestCase):
             f.close()
             self.assertEqual(iface.FilesystemListOpenFiles(), [])
 
+            self._do_file_perms_checks(type, mount_path)
+
             # unmount
             self.retry_busy(self.partition_iface().FilesystemUnmount, [])
             self.failIf(os.path.exists(mount_path), 'mount point was not removed')
@@ -677,6 +683,40 @@ class FS(UDisksTestCase):
         # check fs
         self.assertEqual(iface.FilesystemCheck([]), True)
 
+    def _do_file_perms_checks(self, type, mount_point):
+        '''Check for permissions for data files and executables.
+
+        This particularly checks sane and useful permissions on non-Unix file
+        systems like vfat.
+        '''
+        if type in BROKEN_PERMISSIONS_FS:
+            return
+
+        f = os.path.join(mount_point, 'simpledata.txt')
+        open(f, 'w').close()
+        self.assert_(os.access(f, os.R_OK))
+        self.assert_(os.access(f, os.W_OK))
+        self.failIf(os.access(f, os.X_OK))
+
+        f = os.path.join(mount_point, 'simple.exe')
+        shutil.copy('/bin/bash', f)
+        self.assert_(os.access(f, os.R_OK))
+        self.assert_(os.access(f, os.W_OK))
+        self.assert_(os.access(f, os.X_OK))
+
+        os.mkdir(os.path.join(mount_point, 'subdir'))
+        f = os.path.join(mount_point, 'subdir', 'subdirdata.txt')
+        open(f, 'w').close()
+        self.assert_(os.access(f, os.R_OK))
+        self.assert_(os.access(f, os.W_OK))
+        self.failIf(os.access(f, os.X_OK))
+
+        f = os.path.join(mount_point, 'subdir', 'subdir.exe')
+        shutil.copy('/bin/bash', f)
+        self.assert_(os.access(f, os.R_OK))
+        self.assert_(os.access(f, os.W_OK))
+        self.assert_(os.access(f, os.X_OK))
+
 
 # ----------------------------------------------------------------------------