)]}'
{"swift/common/middleware/decrypter.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d4ee3efe726b2ff6253dfea0bcf857dd691ed5a0","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def decrypt_user_metadata(self, keys):"},{"line_number":180,"context_line":"        prefix \u003d get_object_transient_sysmeta(\u0027crypto-meta-\u0027)"},{"line_number":181,"context_line":"        prefix_len \u003d len(prefix)"},{"line_number":182,"context_line":"        new_prefix \u003d get_user_meta_prefix(self.server_type)"},{"line_number":183,"context_line":"        result \u003d []"},{"line_number":184,"context_line":"        for name, val in self._response_headers:"},{"line_number":185,"context_line":"            if name.lower().startswith(prefix) and val:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_238f75cd","line":182,"updated":"2016-06-29 07:08:53.000000000","message":"Is the arg a fixed value as \u0027object\u0027? Because transient sysmeta is only for object so that the new prefix should be transformed from x-object-transient-sysmeta-* to x-object-meta-*. Ah, self.server_type should be \u0027object\u0027 because this is in *DecyrpterObjContext*, so probably it\u0027s safe if it\u0027s a variable instead of a fixed value.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def decrypt_user_metadata(self, keys):"},{"line_number":180,"context_line":"        prefix \u003d get_object_transient_sysmeta(\u0027crypto-meta-\u0027)"},{"line_number":181,"context_line":"        prefix_len \u003d len(prefix)"},{"line_number":182,"context_line":"        new_prefix \u003d get_user_meta_prefix(self.server_type)"},{"line_number":183,"context_line":"        result \u003d []"},{"line_number":184,"context_line":"        for name, val in self._response_headers:"},{"line_number":185,"context_line":"            if name.lower().startswith(prefix) and val:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_0977f33a","line":182,"in_reply_to":"3aaa91ec_238f75cd","updated":"2016-06-29 13:30:46.000000000","message":"Yes, server_type will always be \u0027object\u0027 - there is some hangover from pieces of code that were originally authored for generic obj/container/account handling, but then scope reduced to just object.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d4ee3efe726b2ff6253dfea0bcf857dd691ed5a0","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        new_prefix \u003d get_user_meta_prefix(self.server_type)"},{"line_number":183,"context_line":"        result \u003d []"},{"line_number":184,"context_line":"        for name, val in self._response_headers:"},{"line_number":185,"context_line":"            if name.lower().startswith(prefix) and val:"},{"line_number":186,"context_line":"                short_name \u003d name[prefix_len:]"},{"line_number":187,"context_line":"                try:"},{"line_number":188,"context_line":"                    decrypted_value \u003d self.decrypt_value_with_meta("}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_deabe61c","line":185,"updated":"2016-06-29 07:08:53.000000000","message":"nits) I thought expanding is_transient_object_sysmeta might be better like [1] (and also strip_transient_object_sysmeta) but I\u0027m realizing either is fine, right now :P\n\n1: http://paste.openstack.org/show/523913/","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        new_prefix \u003d get_user_meta_prefix(self.server_type)"},{"line_number":183,"context_line":"        result \u003d []"},{"line_number":184,"context_line":"        for name, val in self._response_headers:"},{"line_number":185,"context_line":"            if name.lower().startswith(prefix) and val:"},{"line_number":186,"context_line":"                short_name \u003d name[prefix_len:]"},{"line_number":187,"context_line":"                try:"},{"line_number":188,"context_line":"                    decrypted_value \u003d self.decrypt_value_with_meta("}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_e94427b8","line":185,"in_reply_to":"3aaa91ec_deabe61c","updated":"2016-06-29 13:30:46.000000000","message":"Nice idea but I think i will leave it as it is - if I change the helper method signature to accept \u0027prefix\u0027 then I will also need to write more tests ;)","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d4ee3efe726b2ff6253dfea0bcf857dd691ed5a0","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                    msg \u003d \"Error decrypting header\""},{"line_number":192,"context_line":"                    self.logger.error(\"%s %s: %s\", msg, name, e)"},{"line_number":193,"context_line":"                    raise HTTPInternalServerError("},{"line_number":194,"context_line":"                        body\u003dmsg, content_type\u003d\u0027text/plain\u0027)"},{"line_number":195,"context_line":"                result.append((new_prefix + short_name, decrypted_value))"},{"line_number":196,"context_line":"        return result"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_9e15de4a","line":194,"updated":"2016-06-29 07:08:53.000000000","message":"May we show the error message that we failed at decrypting the header for API callers? Probably, they don\u0027t know anything why it happened and no way to solve it.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                    msg \u003d \"Error decrypting header\""},{"line_number":192,"context_line":"                    self.logger.error(\"%s %s: %s\", msg, name, e)"},{"line_number":193,"context_line":"                    raise HTTPInternalServerError("},{"line_number":194,"context_line":"                        body\u003dmsg, content_type\u003d\u0027text/plain\u0027)"},{"line_number":195,"context_line":"                result.append((new_prefix + short_name, decrypted_value))"},{"line_number":196,"context_line":"        return result"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_74a80adc","line":194,"in_reply_to":"3aaa91ec_9e15de4a","updated":"2016-06-29 13:30:46.000000000","message":"In general I have avoided including any detailed information about internal implementation in the response to clients, whereas the log has all the details. Also, I want to avoid ever accidentally revealing any information about the keys, so being paranoid I would prefer not to forward exception messages on to the client just in case someone does something silly and raises an exception with message like \"Failed while using this key: \u003cmy secret\u003e\".","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"05a8c05c3ff5bc2f98417ba24e01c7d3fbb50dcc","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            mod_hdr_pairs.append((etag_header, decrypted_etag))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        # Decrypt all user metadata"},{"line_number":231,"context_line":"        mod_hdr_pairs.extend(self.decrypt_user_metadata(keys))"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        mod_hdr_names \u003d {h.lower() for h, v in mod_hdr_pairs}"},{"line_number":234,"context_line":"        mod_resp_headers \u003d [(h, v) for h, v in self._response_headers"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_ceab4388","line":231,"updated":"2016-06-28 22:11:40.000000000","message":"So if we (somehow) find ourselves with *both* X-Object-Transient-Sysmeta-Crypto-Meta-Foo and X-Object-Meta-Foo values, the encrypted value wins.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            mod_hdr_pairs.append((etag_header, decrypted_etag))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        # Decrypt all user metadata"},{"line_number":231,"context_line":"        mod_hdr_pairs.extend(self.decrypt_user_metadata(keys))"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        mod_hdr_names \u003d {h.lower() for h, v in mod_hdr_pairs}"},{"line_number":234,"context_line":"        mod_resp_headers \u003d [(h, v) for h, v in self._response_headers"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_74f64afa","line":231,"in_reply_to":"3aaa91ec_ceab4388","updated":"2016-06-29 13:30:46.000000000","message":"Yes, I\u0027ll add a comment to that effect. And a test assertion.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"}],"swift/common/middleware/encrypter.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"05a8c05c3ff5bc2f98417ba24e01c7d3fbb50dcc","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            enc_val, meta \u003d encrypt_header_val("},{"line_number":218,"context_line":"                self.crypto, val, keys[self.server_type])"},{"line_number":219,"context_line":"            req.headers[new_name] \u003d append_crypto_meta(enc_val, meta)"},{"line_number":220,"context_line":"            req.headers.pop(name)"},{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_0eb1cb8f","line":220,"updated":"2016-06-28 22:11:40.000000000","message":"Do we want req.headers.pop(name), or req.headers[name] \u003d \u0027\u0027?\n\nI see two arguments in favor of the latter:\n- If we ever get updateable metadata, we\u0027ll need to do that anyway.\n- If we ever get py3 support, we\u0027ll avoid triggering\n\n     RuntimeError: dictionary changed size during iteration","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            enc_val, meta \u003d encrypt_header_val("},{"line_number":218,"context_line":"                self.crypto, val, keys[self.server_type])"},{"line_number":219,"context_line":"            req.headers[new_name] \u003d append_crypto_meta(enc_val, meta)"},{"line_number":220,"context_line":"            req.headers.pop(name)"},{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_775ac984","line":220,"in_reply_to":"3aaa91ec_0eb1cb8f","updated":"2016-06-29 13:30:46.000000000","message":"If we don\u0027t pop the header then we\u0027re back to sending 2x headers, which I\u0027d rather avoid, at least until we have to.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d4ee3efe726b2ff6253dfea0bcf857dd691ed5a0","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            enc_val, meta \u003d encrypt_header_val("},{"line_number":218,"context_line":"                self.crypto, val, keys[self.server_type])"},{"line_number":219,"context_line":"            req.headers[new_name] \u003d append_crypto_meta(enc_val, meta)"},{"line_number":220,"context_line":"            req.headers.pop(name)"},{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_79a12ca9","line":220,"in_reply_to":"3aaa91ec_0eb1cb8f","updated":"2016-06-29 07:08:53.000000000","message":"Or at L212\n\n user_meta_headers \u003d list(h for h in req.headers.items() if\n                        is_user_meta(self.server_type, h[0]) and h[1])\n\nis safe, right? The py3 error is caused from the user_meta_headers is a reference of req.headers keys.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            enc_val, meta \u003d encrypt_header_val("},{"line_number":218,"context_line":"                self.crypto, val, keys[self.server_type])"},{"line_number":219,"context_line":"            req.headers[new_name] \u003d append_crypto_meta(enc_val, meta)"},{"line_number":220,"context_line":"            req.headers.pop(name)"},{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_faaa2018","line":220,"in_reply_to":"3aaa91ec_79a12ca9","updated":"2016-06-29 13:30:46.000000000","message":"Yes that would be safe in py3 afaict.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"978f96936e59cca982d0cb03592753849ebca329","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"},{"line_number":224,"context_line":"        # for future-proofing - the meta stored here is not currently used."},{"line_number":225,"context_line":"        common_meta \u003d dump_crypto_meta({\u0027key_id\u0027: keys[\u0027id\u0027]})"},{"line_number":226,"context_line":"        req.headers[get_object_transient_sysmeta(\u0027crypto-meta\u0027)] \u003d common_meta"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_674997b7","line":224,"updated":"2016-06-28 20:01:07.000000000","message":"for all of you thinking of the future and updateable metadata etc - if you can solve updateable metadata then you get updateable *sysmeta* so you can play in that namespace for future crypto headers and this should be just fine having the one copy of the key_id for all the *transient* sysmeta.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"05a8c05c3ff5bc2f98417ba24e01c7d3fbb50dcc","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"},{"line_number":224,"context_line":"        # for future-proofing - the meta stored here is not currently used."},{"line_number":225,"context_line":"        common_meta \u003d dump_crypto_meta({\u0027key_id\u0027: keys[\u0027id\u0027]})"},{"line_number":226,"context_line":"        req.headers[get_object_transient_sysmeta(\u0027crypto-meta\u0027)] \u003d common_meta"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_d16e42c8","line":224,"in_reply_to":"3aaa91ec_674997b7","updated":"2016-06-28 22:11:40.000000000","message":"I think it may actually be more complicated than that. (Isn\u0027t that just always the case when we start talking updateable object metadata?) Won\u0027t we still have to worry about a subsequent POST overwriting earlier X-Object-Transient-Sysmeta-Crypto-Meta values?\n\nRegardless, having this seems likely to be more useful than *not* having it, so I\u0027m fine with it.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        # store a single copy of the crypto meta that is common to all"},{"line_number":222,"context_line":"        # encrypted user metadata independently of any such meta that is stored"},{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"},{"line_number":224,"context_line":"        # for future-proofing - the meta stored here is not currently used."},{"line_number":225,"context_line":"        common_meta \u003d dump_crypto_meta({\u0027key_id\u0027: keys[\u0027id\u0027]})"},{"line_number":226,"context_line":"        req.headers[get_object_transient_sysmeta(\u0027crypto-meta\u0027)] \u003d common_meta"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_159eddb7","line":224,"in_reply_to":"3aaa91ec_d16e42c8","updated":"2016-06-29 13:30:46.000000000","message":"hmm, maybe. But it seems crazy to imagine that we\u0027d make *transient* sysmeta become non-transient.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"05a8c05c3ff5bc2f98417ba24e01c7d3fbb50dcc","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"},{"line_number":224,"context_line":"        # for future-proofing - the meta stored here is not currently used."},{"line_number":225,"context_line":"        common_meta \u003d dump_crypto_meta({\u0027key_id\u0027: keys[\u0027id\u0027]})"},{"line_number":226,"context_line":"        req.headers[get_object_transient_sysmeta(\u0027crypto-meta\u0027)] \u003d common_meta"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def handle_put(self, req, start_response):"},{"line_number":229,"context_line":"        self._check_headers(req)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_6e34cffa","line":226,"updated":"2016-06-28 22:11:40.000000000","message":"Should we just call it crypto-key-id, and use dump_crypto_meta(keys[\u0027id\u0027])?","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        # with the object body because it might change on a POST. This is done"},{"line_number":224,"context_line":"        # for future-proofing - the meta stored here is not currently used."},{"line_number":225,"context_line":"        common_meta \u003d dump_crypto_meta({\u0027key_id\u0027: keys[\u0027id\u0027]})"},{"line_number":226,"context_line":"        req.headers[get_object_transient_sysmeta(\u0027crypto-meta\u0027)] \u003d common_meta"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def handle_put(self, req, start_response):"},{"line_number":229,"context_line":"        self._check_headers(req)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_f5c87176","line":226,"in_reply_to":"3aaa91ec_6e34cffa","updated":"2016-06-29 13:30:46.000000000","message":"I\u0027d like to move cipher into this too. I can\u0027t yet easily remove it from the other meta dicts because there are checks that insist on it being there, so that will have to wait.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"}],"test/unit/common/middleware/test_decrypter.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"05a8c05c3ff5bc2f98417ba24e01c7d3fbb50dcc","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            \u0027X-Object-Sysmeta-Crypto-Body-Meta\u0027:"},{"line_number":74,"context_line":"                get_crypto_meta_header(body_crypto_meta),"},{"line_number":75,"context_line":"            \u0027x-object-transient-sysmeta-crypto-meta-test\u0027:"},{"line_number":76,"context_line":"                base64.b64encode(encrypt(\u0027encrypt me\u0027, object_key, FAKE_IV)) +"},{"line_number":77,"context_line":"                \u0027;swift_meta\u003d\u0027 + get_crypto_meta_header(),"},{"line_number":78,"context_line":"            \u0027x-object-sysmeta-container-update-override-etag\u0027:"},{"line_number":79,"context_line":"                encrypt_and_append_meta(\u0027encrypt me, too\u0027, cont_key),"},{"line_number":80,"context_line":"            \u0027x-object-sysmeta-test\u0027: \u0027do not encrypt me\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_d17c8274","line":77,"range":{"start_line":76,"start_character":16,"end_line":77,"end_character":57},"updated":"2016-06-28 22:11:40.000000000","message":"Is it worth making a test helper for this? We do this sort of thing a lot now in tests...","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            \u0027X-Object-Sysmeta-Crypto-Body-Meta\u0027:"},{"line_number":74,"context_line":"                get_crypto_meta_header(body_crypto_meta),"},{"line_number":75,"context_line":"            \u0027x-object-transient-sysmeta-crypto-meta-test\u0027:"},{"line_number":76,"context_line":"                base64.b64encode(encrypt(\u0027encrypt me\u0027, object_key, FAKE_IV)) +"},{"line_number":77,"context_line":"                \u0027;swift_meta\u003d\u0027 + get_crypto_meta_header(),"},{"line_number":78,"context_line":"            \u0027x-object-sysmeta-container-update-override-etag\u0027:"},{"line_number":79,"context_line":"                encrypt_and_append_meta(\u0027encrypt me, too\u0027, cont_key),"},{"line_number":80,"context_line":"            \u0027x-object-sysmeta-test\u0027: \u0027do not encrypt me\u0027}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_ebbecdac","line":77,"range":{"start_line":76,"start_character":16,"end_line":77,"end_character":57},"in_reply_to":"3aaa91ec_d17c8274","updated":"2016-06-29 13:30:46.000000000","message":"Done. Yes, in fact I have been wanting to make a helper to construct the typical set of headers.","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"}],"test/unit/common/middleware/test_encrypter.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d4ee3efe726b2ff6253dfea0bcf857dd691ed5a0","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.assertIn("},{"line_number":50,"context_line":"            \u0027X-Object-Transient-Sysmeta-Crypto-Meta-\u0027 + name, req_hdrs)"},{"line_number":51,"context_line":"        enc_val, param \u003d req_hdrs["},{"line_number":52,"context_line":"            \u0027X-Object-Transient-Sysmeta-Crypto-Meta-Test\u0027].split(\u0027;\u0027)"},{"line_number":53,"context_line":"        param \u003d param.strip()"},{"line_number":54,"context_line":"        self.assertTrue(param.startswith(\u0027swift_meta\u003d\u0027))"},{"line_number":55,"context_line":"        actual_meta \u003d json.loads("}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_9af3270a","line":52,"range":{"start_line":52,"start_character":51,"end_line":52,"end_character":55},"updated":"2016-06-29 07:08:53.000000000","message":"Is \"Test\" a fixed value? I\u0027m not sure yet but it seems that \"+ name\" is suitable and then, probably we need the expected value for method args to assert at L61 (\"encyrpt me\" for Test and \"not to be confused with the Etag!\" for Etag) maybe?","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c01283d1b5fffc56101be8f389ceb5df9a8fbbc3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.assertIn("},{"line_number":50,"context_line":"            \u0027X-Object-Transient-Sysmeta-Crypto-Meta-\u0027 + name, req_hdrs)"},{"line_number":51,"context_line":"        enc_val, param \u003d req_hdrs["},{"line_number":52,"context_line":"            \u0027X-Object-Transient-Sysmeta-Crypto-Meta-Test\u0027].split(\u0027;\u0027)"},{"line_number":53,"context_line":"        param \u003d param.strip()"},{"line_number":54,"context_line":"        self.assertTrue(param.startswith(\u0027swift_meta\u003d\u0027))"},{"line_number":55,"context_line":"        actual_meta \u003d json.loads("}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_cbf95182","line":52,"range":{"start_line":52,"start_character":51,"end_line":52,"end_character":55},"in_reply_to":"3aaa91ec_9af3270a","updated":"2016-06-29 13:30:46.000000000","message":"Done. That\u0027s a bug, well spotted!","commit_id":"b97719ec5f431aedacd42066c1e2ab52c0247e86"}]}
