)]}'
{"swift/common/middleware/keystoneauth.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from swift.common.request_helpers import get_sys_meta_prefix"},{"line_number":19,"context_line":"from swift.common.swob import HTTPNotFound, HTTPForbidden, HTTPUnauthorized"},{"line_number":20,"context_line":"from swift.common.utils import config_read_reseller_options, list_from_csv, \\"},{"line_number":21,"context_line":"    serialize_groups"},{"line_number":22,"context_line":"from swift.proxy.controllers.base import get_account_info"},{"line_number":23,"context_line":"import functools"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_f9457218","line":21,"updated":"2019-01-14 18:04:50.000000000","message":"So we never need to deserialize the groups? It\u0027s just for other middlewares\u0027 benefit?","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        if env_identity:"},{"line_number":210,"context_line":"            self.logger.debug(\u0027Using identity: %r\u0027, env_identity)"},{"line_number":211,"context_line":"            environ[\u0027REMOTE_USER\u0027] \u003d serialize_groups("},{"line_number":212,"context_line":"                env_identity.get(\u0027tenant\u0027))"},{"line_number":213,"context_line":"            environ[\u0027keystone.identity\u0027] \u003d env_identity"},{"line_number":214,"context_line":"            environ[\u0027swift.authorize\u0027] \u003d functools.partial("},{"line_number":215,"context_line":"                self.authorize, env_identity)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_79e3c234","line":212,"range":{"start_line":212,"start_character":16,"end_line":212,"end_character":43},"updated":"2019-01-14 18:04:50.000000000","message":"I know it was pre-existing, but what do you think about switching this to env_identity[\u0027tenant\u0027]? If env_identity is truthy, it should *always* be present, right? And then we don\u0027t need the cognitive overhead of wondering whether serialize_groups properly handles None inputs...","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"0bcfdc9cf79df654a6069fb4b934baa61db021c9","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        if env_identity:"},{"line_number":210,"context_line":"            self.logger.debug(\u0027Using identity: %r\u0027, env_identity)"},{"line_number":211,"context_line":"            environ[\u0027REMOTE_USER\u0027] \u003d serialize_groups("},{"line_number":212,"context_line":"                env_identity.get(\u0027tenant\u0027))"},{"line_number":213,"context_line":"            environ[\u0027keystone.identity\u0027] \u003d env_identity"},{"line_number":214,"context_line":"            environ[\u0027swift.authorize\u0027] \u003d functools.partial("},{"line_number":215,"context_line":"                self.authorize, env_identity)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_2f744d99","line":212,"range":{"start_line":212,"start_character":16,"end_line":212,"end_character":43},"in_reply_to":"bfdaf3ff_79e3c234","updated":"2019-05-04 22:17:12.000000000","message":"With the changes in this patch, it will always be set to at least the empty string. Done.","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"69eee6af6bef941e5f817352b6adf4d1c251789f","unresolved":false,"context_lines":[{"line_number":248,"context_line":"                                           environ.get(\u0027HTTP_X_TENANT_ID\u0027,"},{"line_number":249,"context_line":"                                                       \u0027\u0027)),"},{"line_number":250,"context_line":"                               environ.get(\u0027HTTP_X_PROJECT_NAME\u0027,"},{"line_number":251,"context_line":"                                           environ.get(\u0027HTTP_X_TENANT_NAME\u0027,"},{"line_number":252,"context_line":"                                                       \u0027\u0027))),"},{"line_number":253,"context_line":"                    \u0027roles\u0027: roles,"},{"line_number":254,"context_line":"                    \u0027service_roles\u0027: service_roles}"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_4377b5a0","line":251,"updated":"2019-08-28 23:34:00.000000000","message":"Hmm... https://review.opendev.org/#/c/613681/\n\nI have no idea whether we ought to assume these are WSGI or non-WSGI :-(","commit_id":"4694077a7da937c34cf415aa980e42e342893268"}],"swift/common/middleware/tempauth.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                if groups and service_groups:"},{"line_number":291,"context_line":"                    groups +\u003d service_groups"},{"line_number":292,"context_line":"            if groups:"},{"line_number":293,"context_line":"                group_list \u003d groups.split(\u0027\\x00\u0027, 2)"},{"line_number":294,"context_line":"                if len(group_list) \u003e 1:"},{"line_number":295,"context_line":"                    user \u003d group_list[1]"},{"line_number":296,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_99730681","line":293,"range":{"start_line":293,"start_character":36,"end_line":293,"end_character":52},"updated":"2019-01-14 18:04:50.000000000","message":"Not using deserialize_groups? I guess it\u0027s because of the limit... but won\u0027t this negatively impact upgrades?","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"0bcfdc9cf79df654a6069fb4b934baa61db021c9","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                if groups and service_groups:"},{"line_number":291,"context_line":"                    groups +\u003d service_groups"},{"line_number":292,"context_line":"            if groups:"},{"line_number":293,"context_line":"                group_list \u003d groups.split(\u0027\\x00\u0027, 2)"},{"line_number":294,"context_line":"                if len(group_list) \u003e 1:"},{"line_number":295,"context_line":"                    user \u003d group_list[1]"},{"line_number":296,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_65cb2a53","line":293,"range":{"start_line":293,"start_character":36,"end_line":293,"end_character":52},"in_reply_to":"bfdaf3ff_99730681","updated":"2019-05-04 22:17:12.000000000","message":"Changed to us deserialize_groups().","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                                                   account_id)"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"                if expires \u003e time() and \\"},{"line_number":810,"context_line":"                        set(old_groups) \u003d\u003d set(new_groups.split(\u0027\\x00\u0027)):"},{"line_number":811,"context_line":"                    token \u003d candidate_token"},{"line_number":812,"context_line":"        # Create a new token if one didn\u0027t exist"},{"line_number":813,"context_line":"        if not token:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_b9704a74","line":810,"range":{"start_line":810,"start_character":57,"end_line":810,"end_character":71},"updated":"2019-01-14 18:04:50.000000000","message":"this shouldn\u0027t have the same upgrade impact, but I think using deserialize_groups would be more readable...","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"69eee6af6bef941e5f817352b6adf4d1c251789f","unresolved":false,"context_lines":[{"line_number":558,"context_line":"                headers \u003d [(\u0027Content-Type\u0027, \u0027text/plain; charset\u003dUTF-8\u0027)]"},{"line_number":559,"context_line":"                return HTTPBadRequest(request\u003dreq, headers\u003dheaders, body\u003dmsg)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        user_groups \u003d deserialize_groups((req.remote_user or \u0027\u0027))"},{"line_number":562,"context_line":"        account_user \u003d user_groups[1] if len(user_groups) \u003e 1 else None"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        if \u0027.reseller_admin\u0027 in user_groups and \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_e354a100","line":561,"range":{"start_line":561,"start_character":41,"end_line":561,"end_character":42},"updated":"2019-08-28 23:34:00.000000000","message":"nit: unneeded parens","commit_id":"4694077a7da937c34cf415aa980e42e342893268"}],"swift/common/utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":5636,"context_line":""},{"line_number":5637,"context_line":""},{"line_number":5638,"context_line":"def deserialize_groups(serialized_groups):"},{"line_number":5639,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5640,"context_line":"        return serialized_groups.split(\u0027\\x00\u0027)"},{"line_number":5641,"context_line":"    elif isinstance(serialized_groups, (list, tuple)):"},{"line_number":5642,"context_line":"        return [group.encode(\u0027utf-8\u0027) for group in serialized_groups]"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_99f8e6c4","line":5639,"updated":"2019-01-14 18:04:50.000000000","message":"Might want to do the instance check *first*, so we know we aren\u0027t dealing with a list or tuple that happens to (somehow) container a null char.","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"0bcfdc9cf79df654a6069fb4b934baa61db021c9","unresolved":false,"context_lines":[{"line_number":5636,"context_line":""},{"line_number":5637,"context_line":""},{"line_number":5638,"context_line":"def deserialize_groups(serialized_groups):"},{"line_number":5639,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5640,"context_line":"        return serialized_groups.split(\u0027\\x00\u0027)"},{"line_number":5641,"context_line":"    elif isinstance(serialized_groups, (list, tuple)):"},{"line_number":5642,"context_line":"        return [group.encode(\u0027utf-8\u0027) for group in serialized_groups]"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_25c5323d","line":5639,"in_reply_to":"bfdaf3ff_99f8e6c4","updated":"2019-05-04 22:17:12.000000000","message":"Done","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":5637,"context_line":""},{"line_number":5638,"context_line":"def deserialize_groups(serialized_groups):"},{"line_number":5639,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5640,"context_line":"        return serialized_groups.split(\u0027\\x00\u0027)"},{"line_number":5641,"context_line":"    elif isinstance(serialized_groups, (list, tuple)):"},{"line_number":5642,"context_line":"        return [group.encode(\u0027utf-8\u0027) for group in serialized_groups]"},{"line_number":5643,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_3933faad","line":5640,"updated":"2019-01-14 18:04:50.000000000","message":"No rstrip(\u0027\\x00\u0027) before the split?","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"0bcfdc9cf79df654a6069fb4b934baa61db021c9","unresolved":false,"context_lines":[{"line_number":5637,"context_line":""},{"line_number":5638,"context_line":"def deserialize_groups(serialized_groups):"},{"line_number":5639,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5640,"context_line":"        return serialized_groups.split(\u0027\\x00\u0027)"},{"line_number":5641,"context_line":"    elif isinstance(serialized_groups, (list, tuple)):"},{"line_number":5642,"context_line":"        return [group.encode(\u0027utf-8\u0027) for group in serialized_groups]"},{"line_number":5643,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_45c2a635","line":5640,"in_reply_to":"bfdaf3ff_3933faad","updated":"2019-05-04 22:17:12.000000000","message":"Done","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f43ff32a2af9cc9200064ee1c443a9d73274767","unresolved":false,"context_lines":[{"line_number":5639,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5640,"context_line":"        return serialized_groups.split(\u0027\\x00\u0027)"},{"line_number":5641,"context_line":"    elif isinstance(serialized_groups, (list, tuple)):"},{"line_number":5642,"context_line":"        return [group.encode(\u0027utf-8\u0027) for group in serialized_groups]"},{"line_number":5643,"context_line":"    else:"},{"line_number":5644,"context_line":"        return serialized_groups.split(\u0027,\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_f92c9248","line":5642,"updated":"2019-01-14 18:04:50.000000000","message":"What are the expectations here on py3?","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"0bcfdc9cf79df654a6069fb4b934baa61db021c9","unresolved":false,"context_lines":[{"line_number":5639,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5640,"context_line":"        return serialized_groups.split(\u0027\\x00\u0027)"},{"line_number":5641,"context_line":"    elif isinstance(serialized_groups, (list, tuple)):"},{"line_number":5642,"context_line":"        return [group.encode(\u0027utf-8\u0027) for group in serialized_groups]"},{"line_number":5643,"context_line":"    else:"},{"line_number":5644,"context_line":"        return serialized_groups.split(\u0027,\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_4804fb17","line":5642,"in_reply_to":"bfdaf3ff_f92c9248","updated":"2019-05-04 22:17:12.000000000","message":"I\u0027m not sure :(\n\nI will try to see what actually happens when we do this and maybe mutate a functional test to use non-ASCII characters.","commit_id":"9aec3b2d0f84b286295dc9def470bfdc18408fa3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"69eee6af6bef941e5f817352b6adf4d1c251789f","unresolved":false,"context_lines":[{"line_number":5795,"context_line":""},{"line_number":5796,"context_line":"def deserialize_groups(serialized_groups):"},{"line_number":5797,"context_line":"    if isinstance(serialized_groups, (list, tuple)):"},{"line_number":5798,"context_line":"        return [group if isinstance(group, bytes) else group.encode(\u0027utf-8\u0027)"},{"line_number":5799,"context_line":"                for group in serialized_groups]"},{"line_number":5800,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5801,"context_line":"        return serialized_groups.rstrip(\u0027\\x00\u0027).split(\u0027\\x00\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_a339c9d8","line":5798,"range":{"start_line":5798,"start_character":16,"end_line":5798,"end_character":76},"updated":"2019-08-28 23:34:00.000000000","message":"So here it\u0027s always bytes, on both py2 and py3...","commit_id":"4694077a7da937c34cf415aa980e42e342893268"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"69eee6af6bef941e5f817352b6adf4d1c251789f","unresolved":false,"context_lines":[{"line_number":5797,"context_line":"    if isinstance(serialized_groups, (list, tuple)):"},{"line_number":5798,"context_line":"        return [group if isinstance(group, bytes) else group.encode(\u0027utf-8\u0027)"},{"line_number":5799,"context_line":"                for group in serialized_groups]"},{"line_number":5800,"context_line":"    if \u0027\\x00\u0027 in serialized_groups:"},{"line_number":5801,"context_line":"        return serialized_groups.rstrip(\u0027\\x00\u0027).split(\u0027\\x00\u0027)"},{"line_number":5802,"context_line":"    return serialized_groups.split(\u0027,\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_6333d1f7","line":5802,"range":{"start_line":5800,"start_character":4,"end_line":5802,"end_character":39},"updated":"2019-08-28 23:34:00.000000000","message":"...but through here it\u0027s always str?","commit_id":"4694077a7da937c34cf415aa980e42e342893268"}]}
