platform.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import os
  2. import shutil
  3. import sys
  4. import tempfile
  5. import unittest
  6. from attic.platform import acl_get, acl_set
  7. from attic.testsuite import BaseTestCase
  8. ACCESS_ACL = """
  9. user::rw-
  10. user:root:rw-:0
  11. user:9999:r--:9999
  12. group::r--
  13. group:root:r--:0
  14. group:9999:r--:9999
  15. mask::rw-
  16. other::r--
  17. """.strip().encode('ascii')
  18. DEFAULT_ACL = """
  19. user::rw-
  20. user:root:r--:0
  21. user:8888:r--:8888
  22. group::r--
  23. group:root:r--:0
  24. group:8888:r--:8888
  25. mask::rw-
  26. other::r--
  27. """.strip().encode('ascii')
  28. def fakeroot_detected():
  29. return 'FAKEROOTKEY' in os.environ
  30. @unittest.skipUnless(sys.platform.startswith('linux'), 'linux only test')
  31. @unittest.skipIf(fakeroot_detected(), 'not compatible with fakeroot')
  32. class PlatformLinuxTestCase(BaseTestCase):
  33. def setUp(self):
  34. self.tmpdir = tempfile.mkdtemp()
  35. def tearDown(self):
  36. shutil.rmtree(self.tmpdir)
  37. def get_acl(self, path, numeric_owner=False):
  38. item = {}
  39. acl_get(path, item, os.stat(path), numeric_owner=numeric_owner)
  40. return item
  41. def set_acl(self, path, access=None, default=None, numeric_owner=False):
  42. item = {b'acl_access': access, b'acl_default': default}
  43. acl_set(path, item, numeric_owner=numeric_owner)
  44. def test_access_acl(self):
  45. file = tempfile.NamedTemporaryFile()
  46. self.assert_equal(self.get_acl(file.name), {})
  47. self.set_acl(file.name, access=b'user::rw-\ngroup::r--\nmask::rw-\nother::---\nuser:root:rw-:9999\ngroup:root:rw-:9999\n', numeric_owner=False)
  48. self.assert_in(b'user:root:rw-:0', self.get_acl(file.name)[b'acl_access'])
  49. self.assert_in(b'group:root:rw-:0', self.get_acl(file.name)[b'acl_access'])
  50. self.assert_in(b'user:0:rw-:0', self.get_acl(file.name, numeric_owner=True)[b'acl_access'])
  51. file2 = tempfile.NamedTemporaryFile()
  52. self.set_acl(file2.name, access=b'user::rw-\ngroup::r--\nmask::rw-\nother::---\nuser:root:rw-:9999\ngroup:root:rw-:9999\n', numeric_owner=True)
  53. self.assert_in(b'user:9999:rw-:9999', self.get_acl(file2.name)[b'acl_access'])
  54. self.assert_in(b'group:9999:rw-:9999', self.get_acl(file2.name)[b'acl_access'])
  55. def test_default_acl(self):
  56. self.assert_equal(self.get_acl(self.tmpdir), {})
  57. self.set_acl(self.tmpdir, access=ACCESS_ACL, default=DEFAULT_ACL)
  58. self.assert_equal(self.get_acl(self.tmpdir)[b'acl_access'], ACCESS_ACL)
  59. self.assert_equal(self.get_acl(self.tmpdir)[b'acl_default'], DEFAULT_ACL)
  60. @unittest.skipUnless(sys.platform.startswith('darwin'), 'OS X only test')
  61. @unittest.skipIf(fakeroot_detected(), 'not compatible with fakeroot')
  62. class PlatformDarwinTestCase(BaseTestCase):
  63. def setUp(self):
  64. self.tmpdir = tempfile.mkdtemp()
  65. def tearDown(self):
  66. shutil.rmtree(self.tmpdir)
  67. def get_acl(self, path, numeric_owner=False):
  68. item = {}
  69. acl_get(path, item, os.stat(path), numeric_owner=numeric_owner)
  70. return item
  71. def set_acl(self, path, acl, numeric_owner=False):
  72. item = {b'acl_extended': acl}
  73. acl_set(path, item, numeric_owner=numeric_owner)
  74. def test_access_acl(self):
  75. file = tempfile.NamedTemporaryFile()
  76. file2 = tempfile.NamedTemporaryFile()
  77. self.assert_equal(self.get_acl(file.name), {})
  78. self.set_acl(file.name, b'!#acl 1\ngroup:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000:staff:0:allow:read\nuser:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000:root:0:allow:read\n', numeric_owner=False)
  79. self.assert_in(b'group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000014:staff:20:allow:read', self.get_acl(file.name)[b'acl_extended'])
  80. self.assert_in(b'user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000:root:0:allow:read', self.get_acl(file.name)[b'acl_extended'])
  81. self.set_acl(file2.name, b'!#acl 1\ngroup:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000:staff:0:allow:read\nuser:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000:root:0:allow:read\n', numeric_owner=True)
  82. self.assert_in(b'group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000:wheel:0:allow:read', self.get_acl(file2.name)[b'acl_extended'])
  83. self.assert_in(b'group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000::0:allow:read', self.get_acl(file2.name, numeric_owner=True)[b'acl_extended'])