)]}'
{"swift/common/middleware/keymaster.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            # object is copied to another location we can use the key_id"},{"line_number":82,"context_line":"            # (rather than its new path) to calculate its key for a GET or"},{"line_number":83,"context_line":"            # HEAD."},{"line_number":84,"context_line":"            id_name \u003d \"%scrypto-id\" % get_sys_meta_prefix(self.server_type)"},{"line_number":85,"context_line":"            req.headers[id_name] \u003d \\"},{"line_number":86,"context_line":"                base64.b64encode(self.obj_path)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_0bdd180e","line":84,"updated":"2016-03-30 15:32:33.000000000","message":"ok, this gets improved in later patch to use a method to which we pass the key and get back header name","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":509,"context_line":"        if fresh_meta_flag or \u0027swift.post_as_copy\u0027 in sink_req.environ:"},{"line_number":510,"context_line":"            # post-as-copy: ignore new sysmeta, copy existing sysmeta"},{"line_number":511,"context_line":"            condition \u003d lambda k: is_sys_meta(\u0027object\u0027, k)"},{"line_number":512,"context_line":"            remove_items(sink_req.headers, condition)"},{"line_number":513,"context_line":"            copy_header_subset(source_resp, sink_req, condition)"},{"line_number":514,"context_line":"        else:"},{"line_number":515,"context_line":"            # copy/update existing sysmeta, transient_sysmeta and user meta"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_d573bd7e","line":512,"updated":"2016-03-30 15:32:33.000000000","message":"ok, this is just reverting an earlier change on feature/crypto so we are back to same as master","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"}],"test/unit/common/middleware/test_keymaster.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        for method in (\u0027HEAD\u0027, \u0027GET\u0027):"},{"line_number":135,"context_line":"            self.swift.register("},{"line_number":136,"context_line":"                method, path, swob.HTTPOk,"},{"line_number":137,"context_line":"                {\u0027x-object-transient-sysmeta-crypto-meta-foo\u0027: \u0027gotcha\u0027},"},{"line_number":138,"context_line":"                \u0027\u0027)"},{"line_number":139,"context_line":"            app \u003d keymaster.KeyMaster(self.swift,"},{"line_number":140,"context_line":"                                      {\u0027encryption_root_secret\u0027: \u0027secret\u0027})"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_78af4894","line":137,"updated":"2016-03-30 15:32:33.000000000","message":"shouldn\u0027t this have a corresponding x-object-meta-foo header?","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            # returned when keys are \u0027missing\u0027 and crypto-meta is found."},{"line_number":149,"context_line":"            self.assertEqual(\u0027200 OK\u0027, calls[0][0])"},{"line_number":150,"context_line":"            # self.assertEqual(\u0027422 Unprocessable Entity\u0027, calls[0][0])"},{"line_number":151,"context_line":"            self.swift.register("},{"line_number":152,"context_line":"                method, path, swob.HTTPOk,"},{"line_number":153,"context_line":"                {\u0027x-object-sysmeta-crypto-meta\u0027: \u0027gotcha\u0027},"},{"line_number":154,"context_line":"                \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_58dec411","line":151,"updated":"2016-03-30 15:32:33.000000000","message":"took me a while to figure out what this additional test was doing, maybe add comments for different cases","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                method, path, swob.HTTPOk,"},{"line_number":153,"context_line":"                {\u0027x-object-sysmeta-crypto-meta\u0027: \u0027gotcha\u0027},"},{"line_number":154,"context_line":"                \u0027\u0027)"},{"line_number":155,"context_line":"            app \u003d keymaster.KeyMaster(self.swift,"},{"line_number":156,"context_line":"                                      {\u0027encryption_root_secret\u0027: \u0027secret\u0027})"},{"line_number":157,"context_line":"            req \u003d Request.blank(path, environ\u003d{\u0027REQUEST_METHOD\u0027: method})"},{"line_number":158,"context_line":"            start_response, calls \u003d capture_start_response()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_380950de","line":155,"updated":"2016-03-30 15:32:33.000000000","message":"don\u0027t need to redefine app","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            start_response, calls \u003d capture_start_response()"},{"line_number":159,"context_line":"            app(req.environ, start_response)"},{"line_number":160,"context_line":"            self.assertEqual(1, len(calls))"},{"line_number":161,"context_line":"            self.assertEqual(\u0027200 OK\u0027, calls[0][0])"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # but \"crypto-meta\" in other headers is ok"},{"line_number":164,"context_line":"        path \u003d \u0027/v1/a/c/o\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_382f90f7","line":161,"updated":"2016-03-30 15:32:33.000000000","message":"do we expect this to be a 422 in future? if so add a TODO now","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"}],"test/unit/proxy/test_sysmeta.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9dd79768effc9cf006854dc4b847710be618010","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def test_sysmeta_not_updated_by_POST_as_copy(self):"},{"line_number":306,"context_line":"        self.app.object_post_as_copy \u003d True"},{"line_number":307,"context_line":"        self._test_sysmeta_not_updated_by_POST()"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_sysmeta_updated_by_COPY(self):"},{"line_number":310,"context_line":"        # check sysmeta is updated by a COPY in same way as user meta"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_4bbb90e5","line":307,"updated":"2016-03-30 15:32:33.000000000","message":"ok, this relates to the remove_items call in obj.py no longer being commented out.\n\nsysmeta should never be updated on a POST of any kind","commit_id":"b827d562534e84b16189e73c71a0e1bc2e0eb48a"}]}
