| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2015 The Swarming Authors. All rights reserved. | 2 # Copyright 2015 The Swarming Authors. All rights reserved. |
| 3 # Use of this source code is governed by the Apache v2.0 license that can be | 3 # Use of this source code is governed by the Apache v2.0 license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import wsgiref.headers | |
| 7 | |
| 8 from test_env import future | 6 from test_env import future |
| 9 import test_env | 7 import test_env |
| 10 test_env.setup_test_env() | 8 test_env.setup_test_env() |
| 11 | 9 |
| 12 from test_support import test_case | 10 from test_support import test_case |
| 13 import mock | 11 import mock |
| 14 | 12 |
| 15 from components import auth | 13 from components import auth |
| 16 | 14 |
| 15 from proto import project_config_pb2 |
| 17 from proto import service_config_pb2 | 16 from proto import service_config_pb2 |
| 18 import acl | 17 import acl |
| 18 import projects |
| 19 import services |
| 19 import storage | 20 import storage |
| 20 | 21 |
| 21 | 22 |
| 22 class AclTestCase(test_case.TestCase): | 23 class AclTestCase(test_case.TestCase): |
| 23 def setUp(self): | 24 def setUp(self): |
| 24 super(AclTestCase, self).setUp() | 25 super(AclTestCase, self).setUp() |
| 26 self.mock(auth, 'get_current_identity', mock.Mock()) |
| 27 auth.get_current_identity.return_value = auth.Anonymous |
| 25 self.mock(auth, 'is_admin', lambda *_: False) | 28 self.mock(auth, 'is_admin', lambda *_: False) |
| 26 self.mock(auth, 'is_group_member', mock.Mock(return_value=False)) | 29 self.mock(auth, 'is_group_member', mock.Mock(return_value=False)) |
| 30 self.mock(services, 'get_service_async', mock.Mock()) |
| 31 services.get_service_async.side_effect = lambda sid: future(None) |
| 27 | 32 |
| 28 acl_cfg = service_config_pb2.AclCfg( | 33 acl_cfg = service_config_pb2.AclCfg( |
| 29 service_access_group='service-admins', | |
| 30 project_access_group='project-admins', | 34 project_access_group='project-admins', |
| 31 ) | 35 ) |
| 32 self.mock(storage, 'get_self_config_async', lambda *_: future(acl_cfg)) | 36 self.mock(storage, 'get_self_config_async', lambda *_: future(acl_cfg)) |
| 33 | 37 |
| 34 def test_admin_can_read_all(self): | 38 def test_admin_can_read_all(self): |
| 35 self.mock(auth, 'is_admin', mock.Mock(return_value=True)) | 39 self.mock(auth, 'is_admin', mock.Mock(return_value=True)) |
| 36 self.assertTrue(acl.can_read_config_set('services/swarming')) | 40 self.assertTrue(acl.can_read_config_set('services/swarming')) |
| 37 self.assertTrue(acl.can_read_config_set('projects/chromium')) | 41 self.assertTrue(acl.can_read_config_set('projects/chromium')) |
| 38 self.assertTrue(acl.can_read_project_list()) | 42 self.assertTrue(acl.has_project_access('chromium')) |
| 39 | 43 |
| 40 def test_can_read_service_config(self): | 44 def test_has_service_access(self): |
| 41 auth.is_group_member.return_value = True | |
| 42 self.assertTrue(acl.can_read_config_set('services/swarming')) | |
| 43 auth.is_group_member.access_called_once_with('service-admins') | |
| 44 | |
| 45 def test_can_read_service_config_header(self): | |
| 46 headers = wsgiref.headers.Headers([ | |
| 47 ('X-Appengine-Inbound-Appid', 'swarming'), | |
| 48 ]) | |
| 49 self.assertTrue( | |
| 50 acl.can_read_config_set('services/swarming', headers=headers)) | |
| 51 | |
| 52 def test_can_read_service_config_no_access(self): | |
| 53 self.assertFalse(acl.can_read_config_set('services/swarming')) | 45 self.assertFalse(acl.can_read_config_set('services/swarming')) |
| 54 | 46 |
| 55 def test_can_read_project_config(self): | 47 service_cfg = service_config_pb2.Service( |
| 56 auth.is_group_member.return_value = True | 48 id='swarming', access=['group:swarming-app']) |
| 57 self.assertTrue(acl.can_read_config_set('projects/swarming')) | 49 services.get_service_async.side_effect = lambda sid: future(service_cfg) |
| 58 auth.is_group_member.access_called_once_with('project-admins') | 50 auth.is_group_member.side_effect = lambda g: g == 'swarming-app' |
| 51 |
| 52 self.assertTrue(acl.can_read_config_set('services/swarming')) |
| 53 |
| 54 def test_has_service_access_no_access(self): |
| 55 self.assertFalse(acl.can_read_config_set('services/swarming')) |
| 56 |
| 57 def test_has_project_access_group(self): |
| 58 self.mock(projects, 'get_metadata', mock.Mock()) |
| 59 projects.get_metadata.return_value = project_config_pb2.ProjectCfg( |
| 60 access=['group:googlers', 'a@a.com'] |
| 61 ) |
| 62 |
| 63 self.assertFalse(acl.can_read_config_set('projects/secret')) |
| 64 |
| 65 auth.is_group_member.side_effect = lambda name: name == 'googlers' |
| 66 self.assertTrue(acl.can_read_config_set('projects/secret')) |
| 67 |
| 68 auth.is_group_member.side_effect = lambda name: name == 'project-admins' |
| 69 self.assertTrue(acl.can_read_config_set('projects/secret')) |
| 70 |
| 71 def test_has_project_access_identity(self): |
| 72 self.mock(projects, 'get_metadata', mock.Mock()) |
| 73 projects.get_metadata.return_value = project_config_pb2.ProjectCfg( |
| 74 access=['group:googlers', 'a@a.com'] |
| 75 ) |
| 76 |
| 77 self.assertFalse(acl.can_read_config_set('projects/secret')) |
| 78 |
| 79 auth.get_current_identity.return_value = auth.Identity('user', 'a@a.com') |
| 80 self.assertTrue(acl.can_read_config_set('projects/secret')) |
| 59 | 81 |
| 60 def test_can_read_project_config_no_access(self): | 82 def test_can_read_project_config_no_access(self): |
| 61 self.assertFalse(acl.can_read_config_set('projects/swarming')) | 83 self.assertFalse(acl.has_project_access('projects/swarming')) |
| 62 self.assertFalse(acl.can_read_config_set('projects/swarming/refs/heads/x')) | 84 self.assertFalse(acl.can_read_config_set('projects/swarming/refs/heads/x')) |
| 63 | 85 |
| 64 def test_malformed_config_set(self): | 86 def test_malformed_config_set(self): |
| 65 with self.assertRaises(ValueError): | 87 with self.assertRaises(ValueError): |
| 66 acl.can_read_config_set('invalid config set') | 88 acl.can_read_config_set('invalid config set') |
| 67 | 89 |
| 68 | 90 |
| 69 if __name__ == '__main__': | 91 if __name__ == '__main__': |
| 70 test_env.main() | 92 test_env.main() |
| OLD | NEW |