)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a8ab3b8fe116f4741fd38d9baf12a130202abad1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"800e3b21_8630cf3a","updated":"2023-12-12 00:45:17.000000000","message":"came across this change looking at s3acl tests, would like to understand it better before I change it.","commit_id":"7ca1a67d704bc97524cd2b3ec2eede8732e5a9f9"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"88f95b1b74c6287f5ec8d556fc8b9f5f0b4215a7","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            # SignatureDoesNotMatch in actual S3 so we can raise"},{"line_number":302,"context_line":"            # the error immediately here to save redundant check"},{"line_number":303,"context_line":"            # process."},{"line_number":304,"context_line":"            raise SignatureDoesNotMatch()"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        return headers_to_sign"},{"line_number":307,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_7f286896","line":304,"updated":"2018-06-18 15:51:42.000000000","message":"not entirely clear why this one doesn\u0027t get kwargs?\n\n\n\tvagrant@saio:~$ nosetests swift/test/unit/common/middleware/s4api/test_s3request.py\n\t...............E....\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\tERROR: test_headers_to_sign_sigv4 (test.unit.common.middleware.s3api.test_s3request.TestRequest)\n\t----------------------------------------------------------------------\n\tTraceback (most recent call last):\n\t  File \"/home/vagrant/swift/test/unit/common/middleware/s3api/test_s3request.py\", line 600, in test_headers_to_sign_sigv4\n\t    sigv4_req \u003d SigV4Request(req.environ)\n\t  File \"/home/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 436, in __init__\n\t    self.string_to_sign \u003d self._string_to_sign()\n\t  File \"/home/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 377, in _string_to_sign\n\t    sha256(self._canonical_request()).hexdigest()])\n\t  File \"/home/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 344, in _canonical_request\n\t    headers_to_sign \u003d self._headers_to_sign()\n\t  File \"/home/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 305, in _headers_to_sign\n\t    **self.signature_does_not_match_kwargs())\n\t  File \"/home/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 380, in signature_does_not_match_kwargs\n\t    kwargs \u003d super(SigV4Mixin, self).signature_does_not_match_kwargs()\n\t  File \"/home/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 883, in signature_does_not_match_kwargs\n\t    \u0027string_to_sign\u0027: self.string_to_sign,\n\tAttributeError: \u0027SigV4Request\u0027 object has no attribute \u0027string_to_sign\u0027\n\n\t----------------------------------------------------------------------\n\tRan 20 tests in 0.054s\n\n\tFAILED (errors\u003d1)","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b736781c800e8fedc9d8e5d1b5e0c5eba1261893","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            # SignatureDoesNotMatch in actual S3 so we can raise"},{"line_number":302,"context_line":"            # the error immediately here to save redundant check"},{"line_number":303,"context_line":"            # process."},{"line_number":304,"context_line":"            raise SignatureDoesNotMatch()"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        return headers_to_sign"},{"line_number":307,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_955c454d","line":304,"in_reply_to":"5f7c97a3_7f286896","updated":"2018-06-20 00:21:55.000000000","message":"Because you need to know the headers to sign to get all the kwargs. If it wasn\u0027t the AttributeError, there\u0027d be a RuntimeError: maximum recursion depth exceeded.\n\nMaybe it\u0027d be better to drop this early return and let the later checks handle it? Hadn\u0027t looked into it that closely.","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"04682b6180acf6bea0b87f6aee9bdb612808e4d8","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def signature_does_not_match_kwargs(self):"},{"line_number":880,"context_line":"        return {"},{"line_number":881,"context_line":"            \u0027a_w_s_access_key_id\u0027: self.access_key,"},{"line_number":882,"context_line":"            \u0027string_to_sign\u0027: self.string_to_sign,"},{"line_number":883,"context_line":"            \u0027signature_provided\u0027: self.signature,"},{"line_number":884,"context_line":"            \u0027string_to_sign_bytes\u0027: \u0027 \u0027.join("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_86649d23","line":881,"updated":"2018-08-14 03:39:39.000000000","message":"Excuse me, but what is it for? I traced a_w_s_access_key_id all the way to swob.Response(), where it turns into an attribute. And then?","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8248d0f01641eabf2a6ead4ce6fd71f2fb051c64","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def signature_does_not_match_kwargs(self):"},{"line_number":880,"context_line":"        return {"},{"line_number":881,"context_line":"            \u0027a_w_s_access_key_id\u0027: self.access_key,"},{"line_number":882,"context_line":"            \u0027string_to_sign\u0027: self.string_to_sign,"},{"line_number":883,"context_line":"            \u0027signature_provided\u0027: self.signature,"},{"line_number":884,"context_line":"            \u0027string_to_sign_bytes\u0027: \u0027 \u0027.join("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_b2de9e3b","line":881,"in_reply_to":"3f79a3b5_86649d23","updated":"2018-08-14 21:56:05.000000000","message":"So SignatureDoesNotMatch [1] is an ErrorResponse whose body comes from _body_iter [2], where we create a \u003cError\u003e element and fill it with children based on the kwargs [3]. The funky name is an artifact of snake_to_camel [4] and wanting to make it come out as \"AWSAccessKeyId\".\n\n[1] https://github.com/openstack/swift/blob/2.18.0/swift/common/middleware/s3api/s3response.py#L639-L642\n[2] https://github.com/openstack/swift/blob/2.18.0/swift/common/middleware/s3api/s3response.py#L205-L215\n[3] https://github.com/openstack/swift/blob/2.18.0/swift/common/middleware/s3api/s3response.py#L217-L229\n[4] https://github.com/openstack/swift/blob/2.18.0/swift/common/middleware/s3api/utils.py#L49-L50","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"88f95b1b74c6287f5ec8d556fc8b9f5f0b4215a7","unresolved":false,"context_lines":[{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"        if not sw_req.remote_user:"},{"line_number":1348,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1349,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"        _, self.account, _ \u003d split_path(sw_resp.environ[\u0027PATH_INFO\u0027],"},{"line_number":1352,"context_line":"                                        2, 3, True)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_ff15584a","line":1349,"updated":"2018-06-18 15:51:42.000000000","message":"this line doesn\u0027t seem to be covered by existing tests - are we sure it works?","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"11f8e6d11d295714aa8de6134934da1426acfd66","unresolved":false,"context_lines":[{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"        if not sw_req.remote_user:"},{"line_number":1348,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1349,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"        _, self.account, _ \u003d split_path(sw_resp.environ[\u0027PATH_INFO\u0027],"},{"line_number":1352,"context_line":"                                        2, 3, True)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_d801fb06","line":1349,"in_reply_to":"5f7c97a3_5b8d5728","updated":"2018-08-15 00:27:41.000000000","message":"Now covered.","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b736781c800e8fedc9d8e5d1b5e0c5eba1261893","unresolved":false,"context_lines":[{"line_number":1346,"context_line":""},{"line_number":1347,"context_line":"        if not sw_req.remote_user:"},{"line_number":1348,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1349,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"        _, self.account, _ \u003d split_path(sw_resp.environ[\u0027PATH_INFO\u0027],"},{"line_number":1352,"context_line":"                                        2, 3, True)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_5b8d5728","line":1349,"in_reply_to":"5f7c97a3_ff15584a","updated":"2018-06-20 00:21:55.000000000","message":"¯\\_(ツ)_/¯\n\nProbably?","commit_id":"2e59fe942810ac1e1cd459a17b640a06b1869816"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a8ab3b8fe116f4741fd38d9baf12a130202abad1","unresolved":true,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    @s3acl(s3acl_only\u003dTrue)"},{"line_number":310,"context_line":"    def test_object_GET_with_s3acl_and_unknown_user(self):"},{"line_number":311,"context_line":"        self.swift.remote_user \u003d None"},{"line_number":312,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":313,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":314,"context_line":"                            headers\u003d{\u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"c928bd4e_2a78c007","line":311,"updated":"2023-12-12 00:45:17.000000000","message":"it\u0027s not immediately obvious to me what this is doing other beyond testing s3api\u0027s FakeSwift - what is the significance of only setting `env[\u0027REMOTE_USER\u0027] \u003d \u0027authorized\u0027` when self.swift.remote_user is not None?","commit_id":"7ca1a67d704bc97524cd2b3ec2eede8732e5a9f9"}]}
