From 1717bfc9ccdcd30bc850351fe072663c29941d04 Mon Sep 17 00:00:00 2001 From: Charles Hsu Date: Tue, 9 Dec 2014 11:14:25 +0800 Subject: [PATCH] Fix 500 error when no DisplayName in request body. The original data of body from client to set acl like below: test:tester test:tester ... If the attribute "" isn't exist, proxy will return 500 Internal Server Error. Change-Id: Ia02af110109d5ecbcda05f707707b30e604af8f0 Closes-Bug: #1400367 --- swift3/subresource.py | 6 +++++- swift3/test/unit/test_subresource.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/swift3/subresource.py b/swift3/subresource.py index 3f8eeb75..f1a5d153 100644 --- a/swift3/subresource.py +++ b/swift3/subresource.py @@ -412,7 +412,11 @@ class ACL(object): Convert an ElementTree to an ACL instance """ id = elem.find('./Owner/ID').text - name = elem.find('./Owner/DisplayName').text + try: + name = elem.find('./Owner/DisplayName').text + except AttributeError: + name = id + grants = [Grant.from_elem(e) for e in elem.findall('./AccessControlList/Grant')] return cls(Owner(id, name), grants) diff --git a/swift3/test/unit/test_subresource.py b/swift3/test/unit/test_subresource.py index 65d558ff..108ee450 100644 --- a/swift3/test/unit/test_subresource.py +++ b/swift3/test/unit/test_subresource.py @@ -182,6 +182,22 @@ class TestSwift3Subresource(unittest.TestCase): self.assertFalse(self.check_permission(acl, 'test:tester2', 'WRITE_ACP')) + def test_acl_from_elem_by_id_only(self): + elem = ACLPrivate(Owner(id='test:tester', + name='test:tester')).elem() + elem.find('./Owner').remove(elem.find('./Owner/DisplayName')) + acl = ACL.from_elem(elem) + self.assertTrue(self.check_permission(acl, 'test:tester', 'READ')) + self.assertTrue(self.check_permission(acl, 'test:tester', 'WRITE')) + self.assertTrue(self.check_permission(acl, 'test:tester', 'READ_ACP')) + self.assertTrue(self.check_permission(acl, 'test:tester', 'WRITE_ACP')) + self.assertFalse(self.check_permission(acl, 'test:tester2', 'READ')) + self.assertFalse(self.check_permission(acl, 'test:tester2', 'WRITE')) + self.assertFalse(self.check_permission(acl, 'test:tester2', + 'READ_ACP')) + self.assertFalse(self.check_permission(acl, 'test:tester2', + 'WRITE_ACP')) + def test_decode_acl_container(self): access_control_policy = \ {'Owner': 'test:tester',