)]}'
{"doc/source/policy_mapping.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03e380273b8c35341335db79e6c65d5e08f158af","unresolved":false,"context_lines":[{"line_number":172,"context_line":"identity:get_auth_projects                                 GET /v3/auth/projects"},{"line_number":173,"context_line":"identity:get_auth_domains                                  GET /v3/auth/domains"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"identity:list_projects_for_user                            GET /v3/OS-FEDERATION/projects"},{"line_number":176,"context_line":"identity:list_domains_for_user                             GET /v3/OS-FEDERATION/domains"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"identity:list_revoke_events                                GET /v3/OS-REVOKE/events"}],"source_content_type":"text/x-rst","patch_set":60,"id":"3aaa91ec_f0f1f196","line":175,"range":{"start_line":175,"start_character":31,"end_line":175,"end_character":33},"updated":"2016-06-28 05:10:47.000000000","message":"whitespace here and below?","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"248d183dc6baaf2ff9aeac2f7f96e77c88d230df","unresolved":false,"context_lines":[{"line_number":172,"context_line":"identity:get_auth_projects                                 GET /v3/auth/projects"},{"line_number":173,"context_line":"identity:get_auth_domains                                  GET /v3/auth/domains"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"identity:list_projects_for_user                            GET /v3/OS-FEDERATION/projects"},{"line_number":176,"context_line":"identity:list_domains_for_user                             GET /v3/OS-FEDERATION/domains"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"identity:list_revoke_events                                GET /v3/OS-REVOKE/events"}],"source_content_type":"text/x-rst","patch_set":60,"id":"3aaa91ec_044a6383","line":175,"range":{"start_line":175,"start_character":31,"end_line":175,"end_character":33},"in_reply_to":"3aaa91ec_ed03c574","updated":"2016-06-28 14:37:38.000000000","message":"This doesn\u0027t have extra whitespace, it\u0027s only showing that because the new name is smaller than the older name.","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cc59b5b1770821f9092ccdfc1f1d9c1b06469be9","unresolved":false,"context_lines":[{"line_number":172,"context_line":"identity:get_auth_projects                                 GET /v3/auth/projects"},{"line_number":173,"context_line":"identity:get_auth_domains                                  GET /v3/auth/domains"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"identity:list_projects_for_user                            GET /v3/OS-FEDERATION/projects"},{"line_number":176,"context_line":"identity:list_domains_for_user                             GET /v3/OS-FEDERATION/domains"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"identity:list_revoke_events                                GET /v3/OS-REVOKE/events"}],"source_content_type":"text/x-rst","patch_set":60,"id":"3aaa91ec_ed03c574","line":175,"range":{"start_line":175,"start_character":31,"end_line":175,"end_character":33},"in_reply_to":"3aaa91ec_f0f1f196","updated":"2016-06-28 12:38:52.000000000","message":"++ need to remove this","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"}],"etc/policy.json":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"cfbe967a41762af227248b0991c794658634e9af","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    \"identity:get_auth_projects\": \"\","},{"line_number":174,"context_line":"    \"identity:get_auth_domains\": \"\","},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    \"identity:list_projects_for_user\": \"\","},{"line_number":177,"context_line":"    \"identity:list_domains_for_user\": \"\","},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    \"identity:list_revoke_events\": \"\","},{"line_number":180,"context_line":""}],"source_content_type":"application/json","patch_set":56,"id":"7aa08908_44ed6eb6","line":177,"range":{"start_line":176,"start_character":0,"end_line":177,"end_character":41},"updated":"2016-06-16 19:39:16.000000000","message":"Can we change it like this (removing the old entries) ? At very least this change will need a release not saying such entries were replaced","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"63475c229ee67ce08a7c941afc70eeb5e9fe18b1","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    \"identity:get_auth_projects\": \"\","},{"line_number":174,"context_line":"    \"identity:get_auth_domains\": \"\","},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    \"identity:list_projects_for_user\": \"\","},{"line_number":177,"context_line":"    \"identity:list_domains_for_user\": \"\","},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    \"identity:list_revoke_events\": \"\","},{"line_number":180,"context_line":""}],"source_content_type":"application/json","patch_set":56,"id":"3aaa91ec_1b2207ba","line":177,"range":{"start_line":176,"start_character":0,"end_line":177,"end_character":41},"in_reply_to":"5a9d85d2_c1c79710","updated":"2016-06-21 17:54:49.000000000","message":"I\u0027ll create a release note for this.","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c93ae35e56367696d418d7d5405aff47fb29d959","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    \"identity:get_auth_projects\": \"\","},{"line_number":174,"context_line":"    \"identity:get_auth_domains\": \"\","},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    \"identity:list_projects_for_user\": \"\","},{"line_number":177,"context_line":"    \"identity:list_domains_for_user\": \"\","},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    \"identity:list_revoke_events\": \"\","},{"line_number":180,"context_line":""}],"source_content_type":"application/json","patch_set":56,"id":"5a9d85d2_c1c79710","line":177,"range":{"start_line":176,"start_character":0,"end_line":177,"end_character":41},"in_reply_to":"7aa08908_44ed6eb6","updated":"2016-06-21 14:03:25.000000000","message":"I believe it\u0027s okay to replace these entries. Existing deployments will need to update their policy file if they are using the deprecated methods. We can document this in the release notes.","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"}],"keystone/federation/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"de9b2b51ec2dae12050b7abe147031908e790d8f","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        projects \u003d projects + self.assignment_api.list_projects_for_user("},{"line_number":464,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":465,"context_line":"        # remove duplicates"},{"line_number":466,"context_line":"        projects \u003d [dict(t) for t in set([tuple(d.items()) for d in projects])]"},{"line_number":467,"context_line":"        return ProjectAssignmentV3.wrap_collection(context, projects)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"7aa08908_b0f697d4","line":466,"updated":"2016-06-14 15:43:47.000000000","message":"nit: comparing this to line 439, does d represent `dictionary` or `domain`? If it represent `dictionary` then the `for d in domains` and `for d in projects` makes sense. If it is shorthand for domain then should this be `for p in projects`?","commit_id":"11bd969b92da35ceb1136545d98110b106d44d3a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"8f55e5b591067f636f0e1c8184334cd8738d978f","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        projects \u003d projects + self.assignment_api.list_projects_for_user("},{"line_number":464,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":465,"context_line":"        # remove duplicates"},{"line_number":466,"context_line":"        projects \u003d [dict(t) for t in set([tuple(d.items()) for d in projects])]"},{"line_number":467,"context_line":"        return ProjectAssignmentV3.wrap_collection(context, projects)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"7aa08908_5d42eb68","line":466,"in_reply_to":"7aa08908_b0f697d4","updated":"2016-06-14 16:09:43.000000000","message":"yeah, it\u0027s d for dictionary","commit_id":"11bd969b92da35ceb1136545d98110b106d44d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"cfbe967a41762af227248b0991c794658634e9af","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self.get_member_from_driver \u003d self.resource_api.get_domain"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    @controller.protected()"},{"line_number":432,"context_line":"    def list_domains_for_user(self, request):"},{"line_number":433,"context_line":"        \"\"\"List all domains available to an authenticated user."},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":56,"id":"7aa08908_c40e7e8b","line":432,"range":{"start_line":432,"start_character":8,"end_line":432,"end_character":29},"updated":"2016-06-16 19:39:16.000000000","message":"Isn\u0027t this a public attribute ? Can we simply change its name this way?","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c93ae35e56367696d418d7d5405aff47fb29d959","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self.get_member_from_driver \u003d self.resource_api.get_domain"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    @controller.protected()"},{"line_number":432,"context_line":"    def list_domains_for_user(self, request):"},{"line_number":433,"context_line":"        \"\"\"List all domains available to an authenticated user."},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a9d85d2_e91c3915","line":432,"range":{"start_line":432,"start_character":8,"end_line":432,"end_character":29},"in_reply_to":"7aa08908_c40e7e8b","updated":"2016-06-21 14:03:25.000000000","message":"Yes, I think we can change it, as it doesn\u0027t have any other dependencies and is not a public interface method.","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"cfbe967a41762af227248b0991c794658634e9af","unresolved":false,"context_lines":[{"line_number":457,"context_line":"        self.get_member_from_driver \u003d self.resource_api.get_project"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    @controller.protected()"},{"line_number":460,"context_line":"    def list_projects_for_user(self, request):"},{"line_number":461,"context_line":"        \"\"\"List all projects available to an authenticated user."},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":56,"id":"7aa08908_24266216","line":460,"range":{"start_line":460,"start_character":8,"end_line":460,"end_character":30},"updated":"2016-06-16 19:39:16.000000000","message":"Same as above","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c93ae35e56367696d418d7d5405aff47fb29d959","unresolved":false,"context_lines":[{"line_number":457,"context_line":"        self.get_member_from_driver \u003d self.resource_api.get_project"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    @controller.protected()"},{"line_number":460,"context_line":"    def list_projects_for_user(self, request):"},{"line_number":461,"context_line":"        \"\"\"List all projects available to an authenticated user."},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a9d85d2_49caad6e","line":460,"range":{"start_line":460,"start_character":8,"end_line":460,"end_character":30},"in_reply_to":"7aa08908_24266216","updated":"2016-06-21 14:03:25.000000000","message":"See comment above.","commit_id":"13084b8490a1cd4b6a8358120fc9d5687201880a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03e380273b8c35341335db79e6c65d5e08f158af","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_01c4313e","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"updated":"2016-06-28 05:10:47.000000000","message":"this works, i tested it, but damn this is this some black magic python,\n\nadd a comment linking to: http://stackoverflow.com/questions/9427163/remove-duplicate-dict-in-list-in-python if you have to do another revision :)","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"aa1c4036ecd316a7dc5b1a7a32dd6e46c95daaca","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_e7492490","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_01c4313e","updated":"2016-06-28 12:09:36.000000000","message":"++ I made similar comment in a previous patch set, it\u0027s really hard to the maintainability.","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"2381cd49e59a9392ed7b29944e4e66f28eaf1b3a","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_13cd8eb7","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_0d5d7179","updated":"2016-06-28 12:59:23.000000000","message":"i removed this single liner and all tests passed. Please justify its usage.","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"dea21e0bbc13d9fd7b59a1e6bf32f058e6d49d58","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_ce9fdc5d","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_13cd8eb7","updated":"2016-06-28 13:54:38.000000000","message":"The method combines domains from groups and from assignments.  This line should simply remove any duplicates.  When I tested it, it worked as well.","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"09d4fd315533b581226fd110e2a5aede49fad5f9","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_8e95d441","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_13cd8eb7","updated":"2016-06-28 13:54:34.000000000","message":"probably need better tests","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"59e3886356e02a29b8440224092e12f5c16ea0ee","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_ceaa3c19","line":446,"in_reply_to":"3aaa91ec_aea89078","updated":"2016-06-28 13:59:19.000000000","message":"Boris, do you have a manual test exercise that you\u0027re seeing issues with? If so, we should try and capture that specific case it in code.","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"874fc9fab0e91fac5d5b46a8512ac55839a608e4","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_e1be2963","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_aea89078","updated":"2016-06-28 14:11:53.000000000","message":"I removed this line and ran \"tox -e py27\". All tests passed. It means that the case when there are duplicates is not tested.","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ef66b661835f5461572693b976f9a5f20116b744","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_4eb64c8b","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_aea89078","updated":"2016-06-28 13:58:54.000000000","message":"we probably need a test where the user gets access to a domain via group membership and user assignment","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"30f7828656b95b1abcd21a988c8bd97901d59489","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_aea89078","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_ce9fdc5d","updated":"2016-06-28 13:55:42.000000000","message":"I\u0027ll add a test for this, but Boris, what do you mean all tests passed when you remove this line?","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"98c4e746e1aa214739e132851060ca6833b2b57f","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_010535c1","line":446,"in_reply_to":"3aaa91ec_ceaa3c19","updated":"2016-06-28 14:05:20.000000000","message":"+1 for Steve\u0027s suggestion of tests","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"17c1c45c6b2ddc207d5f844e09acdd16844fb368","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_2802bf0b","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_e1be2963","updated":"2016-06-28 20:57:51.000000000","message":"Done","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cc59b5b1770821f9092ccdfc1f1d9c1b06469be9","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_0d5d7179","line":446,"range":{"start_line":446,"start_character":8,"end_line":446,"end_character":77},"in_reply_to":"3aaa91ec_e7492490","updated":"2016-06-28 12:38:52.000000000","message":"I like single liners, but this can take a while to understand","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03e380273b8c35341335db79e6c65d5e08f158af","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        projects \u003d projects + self.assignment_api.list_projects_for_user("},{"line_number":472,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":473,"context_line":"        # remove duplicates"},{"line_number":474,"context_line":"        projects \u003d [dict(t) for t in set([tuple(d.items()) for d in projects])]"},{"line_number":475,"context_line":"        return ProjectAssignmentV3.wrap_collection(request.context_dict,"},{"line_number":476,"context_line":"                                                   projects)"},{"line_number":477,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_0149d1d0","line":474,"range":{"start_line":474,"start_character":8,"end_line":474,"end_character":79},"updated":"2016-06-28 05:10:47.000000000","message":"same comment","commit_id":"0ffe8f8f94c9be3535303b26575c63fcf74dffeb"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"fb18a1db783561343120c2d7a264404a45ecc38e","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        domains \u003d domains + self.assignment_api.list_domains_for_user("},{"line_number":444,"context_line":"            auth_context[\u0027user_id\u0027])"},{"line_number":445,"context_line":"        # remove duplicates"},{"line_number":446,"context_line":"        domains \u003d [dict(t) for t in set([tuple(d.items()) for d in domains])]"},{"line_number":447,"context_line":"        return DomainV3.wrap_collection(request.context_dict, domains)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_06023509","line":446,"updated":"2016-06-29 11:48:49.000000000","message":"leaving as reference how the duplicates were removed in auth/controller.py: https://github.com/openstack/keystone/blob/master/keystone/auth/controllers.py#L595-L601","commit_id":"eed233cac8f34ce74a2f6fa989c484773c491df3"}],"keystone/federation/utils.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"e3cd05e56e9385acd52d02ec320721d730f683d2","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        is 0."},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    \"\"\""},{"line_number":341,"context_line":"    # TODO(rderose): remove cardinality check, as federated users can now"},{"line_number":342,"context_line":"    #                receive direct role assignments"},{"line_number":343,"context_line":"    validate_groups_cardinality(group_ids, mapping_id)"},{"line_number":344,"context_line":"    validate_groups_in_backend(group_ids, mapping_id, identity_api)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_d4e9a5b8","line":342,"range":{"start_line":341,"start_character":4,"end_line":342,"end_character":52},"updated":"2016-06-01 12:38:38.000000000","message":"Why not remove it in this patch ? Does this work with this check present ? I don\u0027t see a followup patch removing it","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9c1a832c927facaefb304ef2e2971f95d9b28095","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        is 0."},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    \"\"\""},{"line_number":341,"context_line":"    # TODO(rderose): remove cardinality check, as federated users can now"},{"line_number":342,"context_line":"    #                receive direct role assignments"},{"line_number":343,"context_line":"    validate_groups_cardinality(group_ids, mapping_id)"},{"line_number":344,"context_line":"    validate_groups_in_backend(group_ids, mapping_id, identity_api)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_125df314","line":342,"range":{"start_line":341,"start_character":4,"end_line":342,"end_character":52},"in_reply_to":"9abb7d3a_d4e9a5b8","updated":"2016-06-01 15:06:17.000000000","message":"The focus of this patch is to allow concrete role assignment for federated users.  The spec has another work item for relaxing the requirement for mappings to result in group memberships:\nhttps://github.com/openstack/keystone-specs/blob/master/specs/keystone/newton/shadow-users-newton.rst  \n\nI\u0027ll have a separate patch for that work item and removing the cardinality check will be part of it.  I just wanted capture the TODO now as I noticed it while working on this patch.","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"}],"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1be5db863289964a0f2d4a7b961c83b27582fd5b","unresolved":false,"context_lines":[{"line_number":2562,"context_line":"        super(FederatedUserTests, self).load_fixtures(fixtures)"},{"line_number":2563,"context_line":"        self.load_federation_sample_data()"},{"line_number":2564,"context_line":""},{"line_number":2565,"context_line":"    def test_unique_id_persist(self):"},{"line_number":2566,"context_line":""},{"line_number":2567,"context_line":"        r1 \u003d self._issue_unscoped_token()"},{"line_number":2568,"context_line":"        t1_resp \u003d r1.json_body[\u0027token\u0027]"},{"line_number":2569,"context_line":""},{"line_number":2570,"context_line":"        r2 \u003d self._issue_unscoped_token()"},{"line_number":2571,"context_line":"        t2_resp \u003d r2.json_body[\u0027token\u0027]"},{"line_number":2572,"context_line":""},{"line_number":2573,"context_line":"        self.assertEqual(t1_resp[\u0027user\u0027][\u0027id\u0027], t2_resp[\u0027user\u0027][\u0027id\u0027])"},{"line_number":2574,"context_line":""},{"line_number":2575,"context_line":"    def test_user_role_assignment(self):"},{"line_number":2576,"context_line":"        \"\"\"Test assigning role assignments to shadow federated users."}],"source_content_type":"text/x-python","patch_set":13,"id":"9aed3d3a_c6b76138","line":2573,"range":{"start_line":2565,"start_character":0,"end_line":2573,"end_character":70},"updated":"2016-02-29 21:13:34.000000000","message":"i don\u0027t see the value in this test, i think it would have been the same before shadow users were stored in sql...","commit_id":"695df8e8f262596b6b2ff34f50a4744802242160"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8b1a888b4b83a9f8bb77a8c4cd293d8913285a5","unresolved":false,"context_lines":[{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("},{"line_number":2625,"context_line":"            user_id, project_ref[\u0027id\u0027], role_ref[\u0027id\u0027])"},{"line_number":2626,"context_line":""},{"line_number":2627,"context_line":"        # create new scoped request; validate authorized (201)"},{"line_number":2628,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d201)"},{"line_number":2629,"context_line":""},{"line_number":2630,"context_line":"        # ensure user can access resource based on role assignment"}],"source_content_type":"text/x-python","patch_set":34,"id":"ba0121b8_7eb8492b","line":2627,"updated":"2016-04-01 19:25:46.000000000","message":"nit: when first reading this comment \u0027validate authorized\u0027 was a little strange to think about. Is it performing an authentication or a validation? Minor suggestion:\n\n    # authenticate with the unscoped token; resulting in a project-scoped token","commit_id":"6aefec53b787d82c8a32eb15a4057910b3575578"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"55231e919f7f2f372713cb8592ce919d27865d32","unresolved":false,"context_lines":[{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("},{"line_number":2625,"context_line":"            user_id, project_ref[\u0027id\u0027], role_ref[\u0027id\u0027])"},{"line_number":2626,"context_line":""},{"line_number":2627,"context_line":"        # create new scoped request; validate authorized (201)"},{"line_number":2628,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d201)"},{"line_number":2629,"context_line":""},{"line_number":2630,"context_line":"        # ensure user can access resource based on role assignment"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a061dce_d273214c","line":2627,"in_reply_to":"ba0121b8_7eb8492b","updated":"2016-04-04 20:44:45.000000000","message":"Done","commit_id":"6aefec53b787d82c8a32eb15a4057910b3575578"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ed0ada93750265b6d3b51a0cbc63fd9ea6489dc5","unresolved":false,"context_lines":[{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("},{"line_number":2625,"context_line":"            user_id, project_ref[\u0027id\u0027], role_ref[\u0027id\u0027])"},{"line_number":2626,"context_line":""},{"line_number":2627,"context_line":"        # create new scoped request; validate authorized (201)"},{"line_number":2628,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d201)"},{"line_number":2629,"context_line":""},{"line_number":2630,"context_line":"        # ensure user can access resource based on role assignment"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a061dce_52b0b1f4","line":2627,"in_reply_to":"ba0121b8_7eb8492b","updated":"2016-04-04 20:44:28.000000000","message":"Good suggestion.  Thanks :)","commit_id":"6aefec53b787d82c8a32eb15a4057910b3575578"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b8d3c4081ee2eb4c796fadcca9e8c17783b14231","unresolved":false,"context_lines":[{"line_number":2592,"context_line":"        self.load_federation_sample_data()"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"    def test_user_id_persistense(self):"},{"line_number":2595,"context_line":"        # ensure user_id is persistend for multiple federated authn calls"},{"line_number":2596,"context_line":"        r \u003d self._issue_unscoped_token()"},{"line_number":2597,"context_line":"        user_id \u003d r.json_body[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":2598,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"9a061dce_6e697725","line":2595,"updated":"2016-04-05 12:49:19.000000000","message":"what is this change for?","commit_id":"7745db0fd1710e5a75020744277737479edff159"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e33ed4fddcf0f8191514976f2673e3dba25623c8","unresolved":false,"context_lines":[{"line_number":2592,"context_line":"        self.load_federation_sample_data()"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"    def test_user_id_persistense(self):"},{"line_number":2595,"context_line":"        # ensure user_id is persistend for multiple federated authn calls"},{"line_number":2596,"context_line":"        r \u003d self._issue_unscoped_token()"},{"line_number":2597,"context_line":"        user_id \u003d r.json_body[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":2598,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"9a061dce_e73bc936","line":2595,"in_reply_to":"9a061dce_6e697725","updated":"2016-04-05 20:35:41.000000000","message":"Some people have reported that using docstrings in tests causes garbage output... I want to say Brant told me this? Not sure if this is a result of that though. I\u0027d be fine with putting this in a separate patch.","commit_id":"7745db0fd1710e5a75020744277737479edff159"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b8d3c4081ee2eb4c796fadcca9e8c17783b14231","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2619,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"},{"line_number":2620,"context_line":"                                               project_ref[\u0027id\u0027])"},{"line_number":2621,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d401)"},{"line_number":2622,"context_line":""},{"line_number":2623,"context_line":"        # assign project role to federated user"},{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("}],"source_content_type":"text/x-python","patch_set":35,"id":"9a061dce_f4bf165e","line":2621,"range":{"start_line":2621,"start_character":67,"end_line":2621,"end_character":70},"updated":"2016-04-05 12:49:19.000000000","message":"we use constants defined in http_client. Please see line 2927 for an example.","commit_id":"7745db0fd1710e5a75020744277737479edff159"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ee97b4066c7b7dc8c9a1ddc53c1351b41b80d582","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2619,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"},{"line_number":2620,"context_line":"                                               project_ref[\u0027id\u0027])"},{"line_number":2621,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d401)"},{"line_number":2622,"context_line":""},{"line_number":2623,"context_line":"        # assign project role to federated user"},{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("}],"source_content_type":"text/x-python","patch_set":35,"id":"5a18252c_c7a3619d","line":2621,"in_reply_to":"9a061dce_474b95c9","updated":"2016-04-12 16:57:55.000000000","message":"Done","commit_id":"7745db0fd1710e5a75020744277737479edff159"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e33ed4fddcf0f8191514976f2673e3dba25623c8","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2619,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"},{"line_number":2620,"context_line":"                                               project_ref[\u0027id\u0027])"},{"line_number":2621,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d401)"},{"line_number":2622,"context_line":""},{"line_number":2623,"context_line":"        # assign project role to federated user"},{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("}],"source_content_type":"text/x-python","patch_set":35,"id":"9a061dce_474b95c9","line":2621,"in_reply_to":"9a061dce_f4bf165e","updated":"2016-04-05 20:35:41.000000000","message":"++ nice catch Boris.","commit_id":"7745db0fd1710e5a75020744277737479edff159"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ee97b4066c7b7dc8c9a1ddc53c1351b41b80d582","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2619,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"},{"line_number":2620,"context_line":"                                               project_ref[\u0027id\u0027])"},{"line_number":2621,"context_line":"        r \u003d self.v3_create_token(v3_scope_request, expected_status\u003d401)"},{"line_number":2622,"context_line":""},{"line_number":2623,"context_line":"        # assign project role to federated user"},{"line_number":2624,"context_line":"        self.assignment_api.add_role_to_user_and_project("}],"source_content_type":"text/x-python","patch_set":35,"id":"5a18252c_679ecd57","line":2621,"range":{"start_line":2621,"start_character":67,"end_line":2621,"end_character":70},"in_reply_to":"9a061dce_f4bf165e","updated":"2016-04-12 16:57:55.000000000","message":"Done","commit_id":"7745db0fd1710e5a75020744277737479edff159"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cf3ddb0790a12c343e1f4d58b19a44c1cccfa030","unresolved":false,"context_lines":[{"line_number":2622,"context_line":"        self.assertValidMappedUser(token_resp)"},{"line_number":2623,"context_line":"        user_id \u003d token_resp[\u0027user\u0027][\u0027id\u0027]"},{"line_number":2624,"context_line":""},{"line_number":2625,"context_line":"        # authenticate with unscoped token; resulting in unauthorized"},{"line_number":2626,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2627,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"},{"line_number":2628,"context_line":"                                               project_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":43,"id":"dab17558_b24e8c93","line":2625,"updated":"2016-05-17 20:17:57.000000000","message":"This results in an unauthorized because the user doesn\u0027t have any role assignments, right (we should add that to this comment)?","commit_id":"2cb43b04d5b66d5953401446eab5efd9c69f2b7a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7381a4e516d67cf8f32adfb8a8e555506ed78f79","unresolved":false,"context_lines":[{"line_number":2622,"context_line":"        self.assertValidMappedUser(token_resp)"},{"line_number":2623,"context_line":"        user_id \u003d token_resp[\u0027user\u0027][\u0027id\u0027]"},{"line_number":2624,"context_line":""},{"line_number":2625,"context_line":"        # authenticate with unscoped token; resulting in unauthorized"},{"line_number":2626,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2627,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"},{"line_number":2628,"context_line":"                                               project_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":43,"id":"dab17558_4fdfb268","line":2625,"in_reply_to":"dab17558_b24e8c93","updated":"2016-05-17 21:25:40.000000000","message":"Done","commit_id":"2cb43b04d5b66d5953401446eab5efd9c69f2b7a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1b530cb29027f6077d1be3dbbe215950362a8c49","unresolved":false,"context_lines":[{"line_number":2622,"context_line":"        self.assertValidMappedUser(token_resp)"},{"line_number":2623,"context_line":"        user_id \u003d token_resp[\u0027user\u0027][\u0027id\u0027]"},{"line_number":2624,"context_line":""},{"line_number":2625,"context_line":"        # authenticate with unscoped token; resulting in unauthorized because"},{"line_number":2626,"context_line":"        # the user doesn\u0027t have any role assignments"},{"line_number":2627,"context_line":"        unscoped_token \u003d r.headers[\u0027X-Subject-Token\u0027]"},{"line_number":2628,"context_line":"        v3_scope_request \u003d self._scope_request(unscoped_token, \u0027project\u0027,"}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_f3597f36","line":2625,"updated":"2016-05-31 21:27:37.000000000","message":"the \"because\" only makes sense if the first part reads something like \"exchange an unscoped token for a scoped token\"\n\nbut i like this step!","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"4e690f36f643c8c68dc5332b009d9f9ee08d8678","unresolved":false,"context_lines":[{"line_number":2652,"context_line":"        self.resource_api.create_project(project_ref2[\u0027id\u0027], project_ref2)"},{"line_number":2653,"context_line":""},{"line_number":2654,"context_line":"        # ensure the user cannot access the 2nd resource (forbidden)"},{"line_number":2655,"context_line":"        path \u003d \u0027/projects/%(project_id)s\u0027 % {\u0027project_id\u0027: project_ref2[\u0027id\u0027]}"},{"line_number":2656,"context_line":"        r \u003d self.v3_request(path\u003dpath, method\u003d\u0027GET\u0027,"},{"line_number":2657,"context_line":"                            expected_status\u003dhttp_client.FORBIDDEN,"},{"line_number":2658,"context_line":"                            token\u003dscoped_token)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_bd02c207","line":2655,"range":{"start_line":2655,"start_character":8,"end_line":2655,"end_character":78},"updated":"2016-06-02 11:58:36.000000000","message":"this is not enough. There is also endpoint /v3/OS-FEDERATION/projects. It needs to be tested.","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c6057a82a2fe0cd9fa00e73ca56e2c13b564430e","unresolved":false,"context_lines":[{"line_number":2652,"context_line":"        self.resource_api.create_project(project_ref2[\u0027id\u0027], project_ref2)"},{"line_number":2653,"context_line":""},{"line_number":2654,"context_line":"        # ensure the user cannot access the 2nd resource (forbidden)"},{"line_number":2655,"context_line":"        path \u003d \u0027/projects/%(project_id)s\u0027 % {\u0027project_id\u0027: project_ref2[\u0027id\u0027]}"},{"line_number":2656,"context_line":"        r \u003d self.v3_request(path\u003dpath, method\u003d\u0027GET\u0027,"},{"line_number":2657,"context_line":"                            expected_status\u003dhttp_client.FORBIDDEN,"},{"line_number":2658,"context_line":"                            token\u003dscoped_token)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_a7bab008","line":2655,"range":{"start_line":2655,"start_character":8,"end_line":2655,"end_character":78},"in_reply_to":"9abb7d3a_bd02c207","updated":"2016-06-02 12:56:48.000000000","message":"how so? /v3/OS-FEDERATION/projects isn\u0027t only to list the projects the federated user has access to before scoping the token?","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"4b22b8833f278b66c35d08c812231b2f9e5ee916","unresolved":false,"context_lines":[{"line_number":2608,"context_line":"        user_id2 \u003d r.json_body[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":2609,"context_line":"        self.assertEqual(user_id, user_id2)"},{"line_number":2610,"context_line":""},{"line_number":2611,"context_line":"    def test_user_role_assignment(self):"},{"line_number":2612,"context_line":"        # create project and role"},{"line_number":2613,"context_line":"        project_ref \u003d unit.new_project_ref("},{"line_number":2614,"context_line":"            domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":51,"id":"7aa08908_fdf6508d","line":2611,"range":{"start_line":2611,"start_character":8,"end_line":2611,"end_character":33},"updated":"2016-06-08 13:33:12.000000000","message":"would be nice to check scoping token to a domain as well","commit_id":"69fd06c06a5c59787c38caabbb2fa6437e939e0b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3e161a3a54c32cf86e3eb32cb28a0edeff4f75ce","unresolved":false,"context_lines":[{"line_number":2657,"context_line":"                            expected_status\u003dhttp_client.FORBIDDEN,"},{"line_number":2658,"context_line":"                            token\u003dscoped_token)"},{"line_number":2659,"context_line":""},{"line_number":2660,"context_line":"    def test_auth_projects_matches_federation_projects(self):"},{"line_number":2661,"context_line":"        # create project and role"},{"line_number":2662,"context_line":"        project_ref \u003d unit.new_project_ref("},{"line_number":2663,"context_line":"            domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":51,"id":"7aa08908_f0ae782c","line":2660,"range":{"start_line":2660,"start_character":8,"end_line":2660,"end_character":54},"updated":"2016-06-08 13:08:14.000000000","message":"also needs \"test_auth_domains_matches_federation_domains\"","commit_id":"69fd06c06a5c59787c38caabbb2fa6437e939e0b"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4e8fa402f89a924dfc03ea4f5a4932884b5ebbbf","unresolved":false,"context_lines":[{"line_number":2657,"context_line":"                            expected_status\u003dhttp_client.FORBIDDEN,"},{"line_number":2658,"context_line":"                            token\u003dscoped_token)"},{"line_number":2659,"context_line":""},{"line_number":2660,"context_line":"    def test_auth_projects_matches_federation_projects(self):"},{"line_number":2661,"context_line":"        # create project and role"},{"line_number":2662,"context_line":"        project_ref \u003d unit.new_project_ref("},{"line_number":2663,"context_line":"            domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":51,"id":"7aa08908_f35fb80c","line":2660,"range":{"start_line":2660,"start_character":8,"end_line":2660,"end_character":54},"in_reply_to":"7aa08908_f0ae782c","updated":"2016-06-13 20:59:16.000000000","message":"Done","commit_id":"69fd06c06a5c59787c38caabbb2fa6437e939e0b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3e161a3a54c32cf86e3eb32cb28a0edeff4f75ce","unresolved":false,"context_lines":[{"line_number":2686,"context_line":""},{"line_number":2687,"context_line":"        # compare"},{"line_number":2688,"context_line":"        self.assertItemsEqual(auth_projects, fed_projects)"},{"line_number":2689,"context_line":""},{"line_number":2690,"context_line":""},{"line_number":2691,"context_line":"class JsonHomeTests(test_v3.RestfulTestCase, test_v3.JsonHomeTestMixin):"},{"line_number":2692,"context_line":"    JSON_HOME_DATA \u003d {"}],"source_content_type":"text/x-python","patch_set":51,"id":"7aa08908_907c54ed","line":2689,"updated":"2016-06-08 13:08:14.000000000","message":"nice! I\u0027d like to see another testcase to make sure it is working for the groups use case:\n\n1. create project1 and role1\n2. create group1\n3. assign role1 to group1 at project1\n4. authenticate via saml and get a user_id\n5. get auth projects\n6. get federation projects\n7. compare\n\nFor this, you would need to be using a mapping that creates a user in a certain group.","commit_id":"69fd06c06a5c59787c38caabbb2fa6437e939e0b"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4e8fa402f89a924dfc03ea4f5a4932884b5ebbbf","unresolved":false,"context_lines":[{"line_number":2686,"context_line":""},{"line_number":2687,"context_line":"        # compare"},{"line_number":2688,"context_line":"        self.assertItemsEqual(auth_projects, fed_projects)"},{"line_number":2689,"context_line":""},{"line_number":2690,"context_line":""},{"line_number":2691,"context_line":"class JsonHomeTests(test_v3.RestfulTestCase, test_v3.JsonHomeTestMixin):"},{"line_number":2692,"context_line":"    JSON_HOME_DATA \u003d {"}],"source_content_type":"text/x-python","patch_set":51,"id":"7aa08908_d35c3c1b","line":2689,"in_reply_to":"7aa08908_907c54ed","updated":"2016-06-13 20:59:16.000000000","message":"Done","commit_id":"69fd06c06a5c59787c38caabbb2fa6437e939e0b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a1d8af8b8721426ae7b21cc9ac8056facced9d13","unresolved":false,"context_lines":[{"line_number":2713,"context_line":"        token_resp \u003d r.json_body[\u0027token\u0027]"},{"line_number":2714,"context_line":"        self.assertValidMappedUser(token_resp)"},{"line_number":2715,"context_line":"        return token_resp[\u0027user\u0027][\u0027id\u0027], unscoped_token"},{"line_number":2716,"context_line":"    "},{"line_number":2717,"context_line":""},{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":"class JsonHomeTests(test_v3.RestfulTestCase, test_v3.JsonHomeTestMixin):"}],"source_content_type":"text/x-python","patch_set":52,"id":"7aa08908_30893627","line":2716,"updated":"2016-06-13 20:48:38.000000000","message":"little extra whitespace here that we could remove.","commit_id":"75aceb007d4040bb239252e90740ef0af52b0b69"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"de9b2b51ec2dae12050b7abe147031908e790d8f","unresolved":false,"context_lines":[{"line_number":2674,"context_line":""},{"line_number":2675,"context_line":"        # get federation projects"},{"line_number":2676,"context_line":"        r \u003d self.get(\u0027/OS-FEDERATION/projects\u0027, token\u003dunscoped_token)"},{"line_number":2677,"context_line":"        fed_projects \u003d r.result[\u0027projects\u0027]"},{"line_number":2678,"context_line":""},{"line_number":2679,"context_line":"        # compare"},{"line_number":2680,"context_line":"        self.assertItemsEqual(auth_projects, fed_projects)"}],"source_content_type":"text/x-python","patch_set":53,"id":"7aa08908_10484bcb","line":2677,"updated":"2016-06-14 15:43:47.000000000","message":"Thanks for adding this check.","commit_id":"11bd969b92da35ceb1136545d98110b106d44d3a"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8012318ea3860d93c98c356933c5376756753eed","unresolved":false,"context_lines":[{"line_number":2679,"context_line":"        # compare"},{"line_number":2680,"context_line":"        self.assertItemsEqual(auth_projects, fed_projects)"},{"line_number":2681,"context_line":""},{"line_number":2682,"context_line":"    def test_auth_projects_matches_federation_projects_with_group_assign(self):"},{"line_number":2683,"context_line":"        # create project, role, group"},{"line_number":2684,"context_line":"        domain_id \u003d CONF.identity.default_domain_id"},{"line_number":2685,"context_line":"        project_ref \u003d unit.new_project_ref(domain_id\u003ddomain_id)"}],"source_content_type":"text/x-python","patch_set":53,"id":"7aa08908_be431341","line":2682,"updated":"2016-06-14 13:38:24.000000000","message":"great tests!","commit_id":"11bd969b92da35ceb1136545d98110b106d44d3a"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"3b38a8cd5d18bb734e527962b53313e0e72f1833","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"        # compare"},{"line_number":2743,"context_line":"        self.assertItemsEqual(auth_projects, fed_projects)"},{"line_number":2744,"context_line":""},{"line_number":2745,"context_line":"    def test_auth_domains_matches_federation_domains(self):"},{"line_number":2746,"context_line":"        # create role, group, and domain"},{"line_number":2747,"context_line":"        domain_ref \u003d unit.new_domain_ref()"},{"line_number":2748,"context_line":"        self.resource_api.create_domain(domain_ref[\u0027id\u0027], domain_ref)"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_2bce52b4","line":2745,"updated":"2016-06-22 16:35:46.000000000","message":"I suggest add other test case using user and domain and role, to match this federation domains","commit_id":"9acd68f82f93dfe97933c8593df69ff222946f16"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ee76820c7e6a197877d20652c854f584b863b307","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"        # compare"},{"line_number":2743,"context_line":"        self.assertItemsEqual(auth_projects, fed_projects)"},{"line_number":2744,"context_line":""},{"line_number":2745,"context_line":"    def test_auth_domains_matches_federation_domains(self):"},{"line_number":2746,"context_line":"        # create role, group, and domain"},{"line_number":2747,"context_line":"        domain_ref \u003d unit.new_domain_ref()"},{"line_number":2748,"context_line":"        self.resource_api.create_domain(domain_ref[\u0027id\u0027], domain_ref)"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_16e9e780","line":2745,"in_reply_to":"3aaa91ec_2bce52b4","updated":"2016-06-23 01:01:23.000000000","message":"Done","commit_id":"9acd68f82f93dfe97933c8593df69ff222946f16"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f2c1f74cf18a0b905d3e0e1b9708c68e0b7d120a","unresolved":false,"context_lines":[{"line_number":2637,"context_line":"        user_id2 \u003d r.json_body[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":2638,"context_line":"        self.assertEqual(user_id, user_id2)"},{"line_number":2639,"context_line":""},{"line_number":2640,"context_line":"    def test_user_role_assignment(self):"},{"line_number":2641,"context_line":"        # create project and role"},{"line_number":2642,"context_line":"        project_ref \u003d unit.new_project_ref("},{"line_number":2643,"context_line":"            domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_aee077fb","line":2640,"range":{"start_line":2640,"start_character":8,"end_line":2640,"end_character":33},"updated":"2016-06-28 21:41:24.000000000","message":"add a similar test where the token is scoped to a domain","commit_id":"131b0a5cf70e5eb5907ec09e195d74345479651c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"30bda30ef3d27d63cb4c1b7842020a075fb6bbdb","unresolved":false,"context_lines":[{"line_number":2637,"context_line":"        user_id2 \u003d r.json_body[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":2638,"context_line":"        self.assertEqual(user_id, user_id2)"},{"line_number":2639,"context_line":""},{"line_number":2640,"context_line":"    def test_user_role_assignment(self):"},{"line_number":2641,"context_line":"        # create project and role"},{"line_number":2642,"context_line":"        project_ref \u003d unit.new_project_ref("},{"line_number":2643,"context_line":"            domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_72b669dd","line":2640,"range":{"start_line":2640,"start_character":8,"end_line":2640,"end_character":33},"in_reply_to":"3aaa91ec_aee077fb","updated":"2016-06-29 02:24:48.000000000","message":"Done","commit_id":"131b0a5cf70e5eb5907ec09e195d74345479651c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f2c1f74cf18a0b905d3e0e1b9708c68e0b7d120a","unresolved":false,"context_lines":[{"line_number":2800,"context_line":"        # compare"},{"line_number":2801,"context_line":"        self.assertItemsEqual(auth_domains, fed_domains)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    def test_list_domains_for_user_duplicates(self):"},{"line_number":2804,"context_line":"        # create role"},{"line_number":2805,"context_line":"        role_ref \u003d unit.new_role_ref()"},{"line_number":2806,"context_line":"        self.role_api.create_role(role_ref[\u0027id\u0027], role_ref)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_6ed68f28","line":2803,"range":{"start_line":2803,"start_character":8,"end_line":2803,"end_character":45},"updated":"2016-06-28 21:41:24.000000000","message":"add a similar test for the list_projects_for_user","commit_id":"131b0a5cf70e5eb5907ec09e195d74345479651c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"30bda30ef3d27d63cb4c1b7842020a075fb6bbdb","unresolved":false,"context_lines":[{"line_number":2800,"context_line":"        # compare"},{"line_number":2801,"context_line":"        self.assertItemsEqual(auth_domains, fed_domains)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    def test_list_domains_for_user_duplicates(self):"},{"line_number":2804,"context_line":"        # create role"},{"line_number":2805,"context_line":"        role_ref \u003d unit.new_role_ref()"},{"line_number":2806,"context_line":"        self.role_api.create_role(role_ref[\u0027id\u0027], role_ref)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_52b9adca","line":2803,"range":{"start_line":2803,"start_character":8,"end_line":2803,"end_character":45},"in_reply_to":"3aaa91ec_6ed68f28","updated":"2016-06-29 02:24:48.000000000","message":"Done","commit_id":"131b0a5cf70e5eb5907ec09e195d74345479651c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"fb18a1db783561343120c2d7a264404a45ecc38e","unresolved":false,"context_lines":[{"line_number":2849,"context_line":"                                         domain_id\u003ddomain_from_group[\u0027id\u0027])"},{"line_number":2850,"context_line":""},{"line_number":2851,"context_line":"        # get user domains and test for duplicates"},{"line_number":2852,"context_line":"        r \u003d self.get(\u0027/OS-FEDERATION/domains\u0027, token\u003dunscoped_token)"},{"line_number":2853,"context_line":"        user_domains \u003d r.result[\u0027domains\u0027]"},{"line_number":2854,"context_line":"        user_domain_ids \u003d []"},{"line_number":2855,"context_line":"        for domain in user_domains:"}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_8691059d","line":2852,"range":{"start_line":2852,"start_character":21,"end_line":2852,"end_character":45},"updated":"2016-06-29 11:48:49.000000000","message":"this needs to check both /auth/domains and /OS-FEDERATION/domains","commit_id":"eed233cac8f34ce74a2f6fa989c484773c491df3"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"fb18a1db783561343120c2d7a264404a45ecc38e","unresolved":false,"context_lines":[{"line_number":2875,"context_line":"            user_id, project_from_group[\u0027id\u0027], role_ref[\u0027id\u0027])"},{"line_number":2876,"context_line":""},{"line_number":2877,"context_line":"        # get user projects and test for duplicates"},{"line_number":2878,"context_line":"        r \u003d self.get(\u0027/OS-FEDERATION/projects\u0027, token\u003dunscoped_token)"},{"line_number":2879,"context_line":"        user_projects \u003d r.result[\u0027projects\u0027]"},{"line_number":2880,"context_line":"        user_project_ids \u003d []"},{"line_number":2881,"context_line":"        for project in user_projects:"}],"source_content_type":"text/x-python","patch_set":63,"id":"3aaa91ec_66f3390b","line":2878,"range":{"start_line":2878,"start_character":21,"end_line":2878,"end_character":46},"updated":"2016-06-29 11:48:49.000000000","message":"this needs to check both /auth/projects and /OS-FEDERATION/projects","commit_id":"eed233cac8f34ce74a2f6fa989c484773c491df3"}],"keystone/token/providers/common.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c40f134c050750ec784d1e793147399ac548ef6e","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                user_id, project_id)"},{"line_number":287,"context_line":"        return [self.role_api.get_role(role_id) for role_id in roles]"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def populate_roles_for_federated_user(self, token_data, group_ids,"},{"line_number":290,"context_line":"                                          project_id\u003dNone, domain_id\u003dNone,"},{"line_number":291,"context_line":"                                          user_id\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Populate roles basing on provided groups and project/domain"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa0719c6_9e6768b6","line":289,"updated":"2016-03-23 21:35:50.000000000","message":"Is this not used for regular users, too, or do they get their roles via the list_effective_roles call?","commit_id":"603e21548f6415d206d30e2048cd6473ab00f081"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b03fa263b748aa6960d7432cc9d159ff4a28c413","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                user_id, project_id)"},{"line_number":287,"context_line":"        return [self.role_api.get_role(role_id) for role_id in roles]"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def populate_roles_for_federated_user(self, token_data, group_ids,"},{"line_number":290,"context_line":"                                          project_id\u003dNone, domain_id\u003dNone,"},{"line_number":291,"context_line":"                                          user_id\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Populate roles basing on provided groups and project/domain"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa0719c6_11298937","line":289,"in_reply_to":"fa0719c6_9e6768b6","updated":"2016-03-23 22:02:17.000000000","message":"Yeah, this is only used for federated user. I believe regular users get the roles from this method: _populate_roles(...)","commit_id":"603e21548f6415d206d30e2048cd6473ab00f081"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"e3cd05e56e9385acd52d02ec320721d730f683d2","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                user_id, project_id)"},{"line_number":287,"context_line":"        return [self.role_api.get_role(role_id) for role_id in roles]"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def populate_roles_for_federated_user(self, token_data, group_ids,"},{"line_number":290,"context_line":"                                          project_id\u003dNone, domain_id\u003dNone,"},{"line_number":291,"context_line":"                                          user_id\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Populate roles basing on provided groups and project/domain."}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_9450bd33","line":289,"range":{"start_line":289,"start_character":8,"end_line":289,"end_character":41},"updated":"2016-06-01 12:38:38.000000000","message":"Is this a public symbol that needs to be deprecated before removal ? i.e any custom providers may be inheriting from it (as it is possible for drivers, for example) ?","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9c1a832c927facaefb304ef2e2971f95d9b28095","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                user_id, project_id)"},{"line_number":287,"context_line":"        return [self.role_api.get_role(role_id) for role_id in roles]"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def populate_roles_for_federated_user(self, token_data, group_ids,"},{"line_number":290,"context_line":"                                          project_id\u003dNone, domain_id\u003dNone,"},{"line_number":291,"context_line":"                                          user_id\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Populate roles basing on provided groups and project/domain."}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_d2a1ab95","line":289,"range":{"start_line":289,"start_character":8,"end_line":289,"end_character":41},"in_reply_to":"9abb7d3a_9450bd33","updated":"2016-06-01 15:06:17.000000000","message":"I don\u0027t believe so.  Custom implementations should not be inheriting from this class.  However, let me know if you still have a concern.","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3a8292ef15f4cffa0b723f789cb193af4d524ef9","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                user_id, project_id)"},{"line_number":287,"context_line":"        return [self.role_api.get_role(role_id) for role_id in roles]"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def populate_roles_for_federated_user(self, token_data, group_ids,"},{"line_number":290,"context_line":"                                          project_id\u003dNone, domain_id\u003dNone,"},{"line_number":291,"context_line":"                                          user_id\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Populate roles basing on provided groups and project/domain."}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_a8cd8b67","line":289,"in_reply_to":"9abb7d3a_d2a1ab95","updated":"2016-06-01 19:45:08.000000000","message":"Correct - if someone wishes to create their own token provider they will be inheriting from the BaseProvider class [0]. A token provider has the ability to leverage these methods in the data helpers if needed - but we don\u0027t require people to implement them if they wish to roll their own provider.  \n\n[0] https://github.com/openstack/keystone/blob/c90c525aacfb8a46677673d735a1dfec3f9e9c20/keystone/token/providers/common.py#L544","commit_id":"8ec1cfdcec8365550c2e8b471e32f6ded50326ae"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"3b38a8cd5d18bb734e527962b53313e0e72f1833","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                                                 project_id)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        # remove duplicates"},{"line_number":341,"context_line":"        roles \u003d [dict(t) for t in set([tuple(d.items()) for d in roles])]"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        check_roles(roles, user_id, project_id, domain_id)"},{"line_number":344,"context_line":"        token_data[\u0027roles\u0027] \u003d roles"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_4bcbdea5","line":341,"updated":"2016-06-22 16:35:46.000000000","message":"I think we can make this more readable, (I know set can be used to remove duplicates, but we can do something like:\nroles_without_duplicate \u003d []\nfor role in roles:\n   if role not in roles_without_duplicate:\n         role_without_duplicate.append(role)","commit_id":"9acd68f82f93dfe97933c8593df69ff222946f16"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ee76820c7e6a197877d20652c854f584b863b307","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                                                 project_id)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        # remove duplicates"},{"line_number":341,"context_line":"        roles \u003d [dict(t) for t in set([tuple(d.items()) for d in roles])]"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        check_roles(roles, user_id, project_id, domain_id)"},{"line_number":344,"context_line":"        token_data[\u0027roles\u0027] \u003d roles"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_76a66b54","line":341,"in_reply_to":"3aaa91ec_4bcbdea5","updated":"2016-06-23 01:01:23.000000000","message":"While I agree this would be more readable, I think using a set is somewhat common for removing duplicates; thus, acceptable.","commit_id":"9acd68f82f93dfe97933c8593df69ff222946f16"}],"keystone/token/providers/fernet/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cf3ddb0790a12c343e1f4d58b19a44c1cccfa030","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        group_ids \u003d [x[\u0027id\u0027] for x in federated_dict[\u0027group_ids\u0027]]"},{"line_number":140,"context_line":"        self.v3_token_data_helper.populate_roles_for_federated_user("},{"line_number":141,"context_line":"            token_dict, group_ids, project_id, domain_id, user_id)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _extract_v2_token_data(self, token_data):"}],"source_content_type":"text/x-python","patch_set":43,"id":"dab17558_1d3fa987","line":140,"updated":"2016-05-17 20:17:57.000000000","message":"This change makes it so that we no longer need federated fernet tokens, right? Or are we planning on keeping the group_id things for backwards compatibility?","commit_id":"2cb43b04d5b66d5953401446eab5efd9c69f2b7a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fb2c972e79dde33ad607a38219489e8ff28cc1ca","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        group_ids \u003d [x[\u0027id\u0027] for x in federated_dict[\u0027group_ids\u0027]]"},{"line_number":140,"context_line":"        self.v3_token_data_helper.populate_roles_for_federated_user("},{"line_number":141,"context_line":"            token_dict, group_ids, project_id, domain_id, user_id)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _extract_v2_token_data(self, token_data):"}],"source_content_type":"text/x-python","patch_set":43,"id":"dab17558_b8866b62","line":140,"in_reply_to":"dab17558_1d3fa987","updated":"2016-05-17 20:35:00.000000000","message":"Yeah, we\u0027re dropping support for federated tokens.  However, federated users can still be mapped to groups via the mapping engine.","commit_id":"2cb43b04d5b66d5953401446eab5efd9c69f2b7a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3a8292ef15f4cffa0b723f789cb193af4d524ef9","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                \u0027idp_id\u0027: idp_id,"},{"line_number":90,"context_line":"                \u0027protocol_id\u0027: protocol_id}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _rebuild_federated_info(self, federated_dict, user_id):"},{"line_number":93,"context_line":"        \"\"\"Format federated information into the token reference."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        The federated_dict is passed back from the federated token formatters."}],"source_content_type":"text/x-python","patch_set":45,"id":"9abb7d3a_28635b43","side":"PARENT","line":92,"updated":"2016-06-01 19:45:08.000000000","message":"All this stuff could be removed in a subsequent patch, too!","commit_id":"f7b33213f1cb8313d2cb81225e8530ebbc37ce18"}]}
