)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"aa49f12b6f2034aeae64713775fc826a4cf61642","unresolved":false,"context_lines":[{"line_number":12,"context_line":"functional test failures."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"e.g. a PUT with x-copy-from will read its input data"},{"line_number":15,"context_line":"from the target object (in proxy object controller)"},{"line_number":16,"context_line":"and read no data from the PUT request body. That"},{"line_number":17,"context_line":"actually works for an encrypted object while we have"},{"line_number":18,"context_line":"a single key - the encrypted object and all its sysmeta"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a18252c_0bafa82a","line":15,"range":{"start_line":15,"start_character":9,"end_line":15,"end_character":15},"updated":"2016-04-14 19:54:03.000000000","message":"source?","commit_id":"ec4c05f6158837ac0094fe2e74c1bf38859bec4d"}],"swift/common/middleware/encrypter.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9342ae8990dbcb044a68faeb0fe23c4c7f7efb22","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    self.keys[\u0027object\u0027], iv_base\u003dself.path)"},{"line_number":113,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Etag\u0027] \u003d val"},{"line_number":114,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Meta-Etag\u0027] \u003d etag_crypto_meta"},{"line_number":115,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Meta\u0027] \u003d _dump_crypto_meta("},{"line_number":116,"context_line":"                    self.body_crypto_meta)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"                # Encrypt the plaintext etag using the container key and use"},{"line_number":119,"context_line":"                # it to override the container update value, with the crypto"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_a4f25599","line":116,"range":{"start_line":115,"start_character":16,"end_line":116,"end_character":42},"updated":"2016-05-04 18:39:19.000000000","message":"Where did this come from? It seems like it\u0027ll be useful and good; why didn\u0027t we have it before? I didn\u0027t notice any test changes related to this...","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dc4357da14750e98304fa6e51efe94e123b341cc","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    self.keys[\u0027object\u0027], iv_base\u003dself.path)"},{"line_number":113,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Etag\u0027] \u003d val"},{"line_number":114,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Meta-Etag\u0027] \u003d etag_crypto_meta"},{"line_number":115,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Meta\u0027] \u003d _dump_crypto_meta("},{"line_number":116,"context_line":"                    self.body_crypto_meta)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"                # Encrypt the plaintext etag using the container key and use"},{"line_number":119,"context_line":"                # it to override the container update value, with the crypto"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_de3742fc","line":116,"range":{"start_line":115,"start_character":16,"end_line":116,"end_character":42},"in_reply_to":"1a122d0e_35e49e3a","updated":"2016-05-05 10:24:51.000000000","message":"This line was relocated from the EncInputWrapper init method (line 94) in base version because I don\u0027t want to send this as a header (a real header) unless the body actually got read, so now sending it as a footer.","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"c843ed666dedf2cde68757343e45cd89b2571d8e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    self.keys[\u0027object\u0027], iv_base\u003dself.path)"},{"line_number":113,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Etag\u0027] \u003d val"},{"line_number":114,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Meta-Etag\u0027] \u003d etag_crypto_meta"},{"line_number":115,"context_line":"                footers[\u0027X-Object-Sysmeta-Crypto-Meta\u0027] \u003d _dump_crypto_meta("},{"line_number":116,"context_line":"                    self.body_crypto_meta)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"                # Encrypt the plaintext etag using the container key and use"},{"line_number":119,"context_line":"                # it to override the container update value, with the crypto"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_35e49e3a","line":116,"range":{"start_line":115,"start_character":16,"end_line":116,"end_character":42},"in_reply_to":"1a122d0e_a4f25599","updated":"2016-05-05 04:24:40.000000000","message":"The dump_crypto_meta method was added in the \"Encrypting/Decrypting object metadata\".  The unit tests invoke this line from test_PUT_backend_response_etag_is_replaced and also invoke the call to the dump_crypto_meta from encrypt_header_val several times.","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9342ae8990dbcb044a68faeb0fe23c4c7f7efb22","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                # pass on footers dict to any other callback that was"},{"line_number":135,"context_line":"                # registered before this one. It may override any footers that"},{"line_number":136,"context_line":"                # were set."},{"line_number":137,"context_line":"                inner_callback(footers)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            if self.body_crypto_ctxt:"},{"line_number":140,"context_line":"                # override any previous notion of etag with the ciphertext etag"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_64ccbdbb","line":137,"updated":"2016-05-04 18:39:19.000000000","message":"This is a bit off-topic, but couldn\u0027t some middleware left of us do something similar to what we\u0027re doing with the ETag? That is,\n\n* pop off what the client provides,\n* perform some manipulation on the data that would change the MD5,\n* do their own validation against the client-provided etag (either on read or in the footers callback), and\n* stick a more appropriate etag in footers.\n\nShould we check for an etag in footers after this callback and compare against plaintext_md5?","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dc4357da14750e98304fa6e51efe94e123b341cc","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                # pass on footers dict to any other callback that was"},{"line_number":135,"context_line":"                # registered before this one. It may override any footers that"},{"line_number":136,"context_line":"                # were set."},{"line_number":137,"context_line":"                inner_callback(footers)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            if self.body_crypto_ctxt:"},{"line_number":140,"context_line":"                # override any previous notion of etag with the ciphertext etag"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_a1ffcbff","line":137,"in_reply_to":"1a122d0e_64ccbdbb","updated":"2016-05-05 10:24:51.000000000","message":"Great point!\n\nI need to move the etag verification  into this callback, and compare against either any etag in footers or the client header etag.","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"3f8ada4079befc6d0e134f529cf2291243b29f24","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                # pass on footers dict to any other callback that was"},{"line_number":135,"context_line":"                # registered before this one. It may override any footers that"},{"line_number":136,"context_line":"                # were set."},{"line_number":137,"context_line":"                inner_callback(footers)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            if self.body_crypto_ctxt:"},{"line_number":140,"context_line":"                # override any previous notion of etag with the ciphertext etag"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_f6deb1d8","line":137,"in_reply_to":"1a122d0e_64ccbdbb","updated":"2016-05-05 03:23:05.000000000","message":"hmm interesting, this means ciphertext_md5 below (Line 141) should also change in case the plaintext_md5 comparison turns out different","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dc4357da14750e98304fa6e51efe94e123b341cc","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                # pass on footers dict to any other callback that was"},{"line_number":135,"context_line":"                # registered before this one. It may override any footers that"},{"line_number":136,"context_line":"                # were set."},{"line_number":137,"context_line":"                inner_callback(footers)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            if self.body_crypto_ctxt:"},{"line_number":140,"context_line":"                # override any previous notion of etag with the ciphertext etag"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_01383fd2","line":137,"in_reply_to":"1a122d0e_f6deb1d8","updated":"2016-05-05 10:24:51.000000000","message":"@Mahati no, the ciphertext_md5 is what we want to send downstream as the Etag regardless of what an upstream middleware thinks the Etag of the plaintext should be.","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9342ae8990dbcb044a68faeb0fe23c4c7f7efb22","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        # the plaintext version if one was calculated in encrypter"},{"line_number":229,"context_line":"        mod_resp_headers \u003d self._response_headers"},{"line_number":230,"context_line":"        if enc_input_proxy.plaintext_md5:"},{"line_number":231,"context_line":"            mod_resp_headers \u003d filter(lambda h: h[0].lower() !\u003d \u0027etag\u0027,"},{"line_number":232,"context_line":"                                      self._response_headers)"},{"line_number":233,"context_line":"            if len(mod_resp_headers) \u003c len(self._response_headers):"},{"line_number":234,"context_line":"                mod_resp_headers.append("},{"line_number":235,"context_line":"                    (\u0027etag\u0027, enc_input_proxy.plaintext_md5.hexdigest()))"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        start_response(self._response_status, mod_resp_headers,"},{"line_number":238,"context_line":"                       self._response_exc_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_c9cdea87","line":235,"range":{"start_line":231,"start_character":12,"end_line":235,"end_character":72},"updated":"2016-05-04 18:39:19.000000000","message":"nit: Why filter then maybe append? Why not something like\n\n plaintext_etag \u003d enc_input_proxy.plaintext_md5.hexdigest()\n mod_resp_headers \u003d [\n     (h, v if h.lower() !\u003d \u0027etag\u0027 else plaintext_etag)\n     for h, v in mod_resp_headers]","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dc4357da14750e98304fa6e51efe94e123b341cc","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        # the plaintext version if one was calculated in encrypter"},{"line_number":229,"context_line":"        mod_resp_headers \u003d self._response_headers"},{"line_number":230,"context_line":"        if enc_input_proxy.plaintext_md5:"},{"line_number":231,"context_line":"            mod_resp_headers \u003d filter(lambda h: h[0].lower() !\u003d \u0027etag\u0027,"},{"line_number":232,"context_line":"                                      self._response_headers)"},{"line_number":233,"context_line":"            if len(mod_resp_headers) \u003c len(self._response_headers):"},{"line_number":234,"context_line":"                mod_resp_headers.append("},{"line_number":235,"context_line":"                    (\u0027etag\u0027, enc_input_proxy.plaintext_md5.hexdigest()))"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        start_response(self._response_status, mod_resp_headers,"},{"line_number":238,"context_line":"                       self._response_exc_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_a19b4bc8","line":235,"range":{"start_line":231,"start_character":12,"end_line":235,"end_character":72},"in_reply_to":"1a122d0e_c9cdea87","updated":"2016-05-05 10:24:51.000000000","message":"Yep, that\u0027s a lot nicer. thanks.","commit_id":"7d065a094358c1b7468355838ad024ed4495b3bb"}]}
