)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"eac4f1f29c58c24e535ff7cd6ff711e75eb6917a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generate tokens basing on the mapping engine output."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Keystone fetches preprocessed by Apache modules parameters,"},{"line_number":10,"context_line":"injects them into the mapping engine rule, generates and handles"},{"line_number":11,"context_line":"unscoped token."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAUH%2F9hdA%3D","line":9,"updated":"2014-02-06 10:27:16.000000000","message":"I would change this phrase, since it will work with any other http server, and even with a module in in the pipeline that sets the required values.","commit_id":"6a715f79330bd82326e7a0ceaf4e77dc8b52cc47"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dec748d2aeb9457d067ec51b1719dd32991ae1f5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generate tokens basing on the mapping engine output."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Keystone fetches preprocessed by Apache modules parameters,"},{"line_number":10,"context_line":"injects them into the mapping engine rule, generates and handles"},{"line_number":11,"context_line":"unscoped token."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAUH%2F9hMw%3D","line":9,"in_reply_to":"AAAAUH%2F9hdA%3D","updated":"2014-02-06 10:58:48.000000000","message":"Good catch! Thanks!","commit_id":"6a715f79330bd82326e7a0ceaf4e77dc8b52cc47"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"31be5c60613dc9bbc692b8eaa121819fe2e33990","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Steve Martinelli \u003cstevemar@ca.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-02-16 02:38:30 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generate tokens basing on the mapping engine output."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Keystone fetches preprocessed by HTTP server modules parameters,"},{"line_number":10,"context_line":"injects them into the mapping engine rule, generates and handles"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAUX%2F%2FIaw%3D","line":7,"updated":"2014-02-16 16:39:36.000000000","message":"Change \"basing\" to \"based\"","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will support authentication via SAML 2.0 assertions."},{"line_number":10,"context_line":"A new authentication plugin will allow external users to authenticate"},{"line_number":11,"context_line":"with keystone, provided the incoming assertion is valid."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I89f70e3a24e825e21580772c088c6fd5c44f3b63"},{"line_number":14,"context_line":"Implements: blueprint saml-id"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"AAAAU3%2F%2F%2Fu8%3D","line":11,"updated":"2014-02-22 18:51:36.000000000","message":"This commit includes a lot more than just an authentication plugin. Suggest split out the other parts into separate commits.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6a781e843ec8fa144d428a035e4cbc1075a975dd","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will support authentication via SAML 2.0 assertions."},{"line_number":10,"context_line":"A new authentication plugin will allow external users to authenticate"},{"line_number":11,"context_line":"with keystone, provided the incoming assertion is valid."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I89f70e3a24e825e21580772c088c6fd5c44f3b63"},{"line_number":14,"context_line":"Implements: blueprint saml-id"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"AAAAU3%2F%2Fz2w%3D","line":11,"in_reply_to":"AAAAU3%2F%2F%2Fu8%3D","updated":"2014-02-24 18:04:03.000000000","message":"they were just merged into a single commit; while i\u0027d generally prefer to review each change as separately, it might not be worth the overhead here as the changes not documented in this commit message were rather small\n\ni think i\u0027d rather just see the commit message revised to be more comprehensive","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":13,"context_line":"The file keystone/contrib/federation/controllers.py was extended with two"},{"line_number":14,"context_line":"new controllers.V3Controller classes:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"*) DomainV3 which handles /v3/OS-FEDERATION/domains API call and returns"},{"line_number":17,"context_line":"   list of domains a user can access based on the provided list of groups."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"*) ProjectV3 which handles /v3/OS-FEDERATION/projects API call and returns"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"AAAAU3%2F%2Fv9M%3D","line":16,"updated":"2014-02-25 00:44:41.000000000","message":"this resource isn\u0027t mentioned in the OS-FEDERATION spec.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7c8cfe8baa5ef9c7c7db4f4c238ca27e693633fa","unresolved":false,"context_lines":[{"line_number":13,"context_line":"The file keystone/contrib/federation/controllers.py was extended with two"},{"line_number":14,"context_line":"new controllers.V3Controller classes:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"*) DomainV3 which handles /v3/OS-FEDERATION/domains API call and returns"},{"line_number":17,"context_line":"   list of domains a user can access based on the provided list of groups."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"*) ProjectV3 which handles /v3/OS-FEDERATION/projects API call and returns"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"AAAAU3%2F%2FvkQ%3D","line":16,"in_reply_to":"AAAAU3%2F%2Fv9M%3D","updated":"2014-02-25 00:47:06.000000000","message":"It\u0027s in review:\nhttps://review.openstack.org/#/c/74531/","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":16,"context_line":"*) DomainV3 which handles /v3/OS-FEDERATION/domains API call and returns"},{"line_number":17,"context_line":"   list of domains a user can access based on the provided list of groups."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"*) ProjectV3 which handles /v3/OS-FEDERATION/projects API call and returns"},{"line_number":20,"context_line":"   list of project a user can access based on the provided list of groups."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I89f70e3a24e825e21580772c088c6fd5c44f3b63"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"AAAAU3%2F%2Fv9A%3D","line":19,"updated":"2014-02-25 00:44:41.000000000","message":"this resource isn\u0027t mentioned in the OS-FEDERATION spec.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"8b10b3ea7219792f7bcb47da1739aa0533a401dd","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"[federation]"},{"line_number":348,"context_line":"#driver \u003d keystone.contrib.federation.backends.sql.Federation"},{"line_number":349,"context_line":"#assertion_prefix \u003d FEDERATION_"},{"line_number":350,"context_line":"[ssl]"},{"line_number":351,"context_line":"#enable \u003d True"},{"line_number":352,"context_line":"#certfile \u003d /etc/keystone/ssl/certs/keystone.pem"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAUH%2F9dTU%3D","line":349,"updated":"2014-02-06 19:31:10.000000000","message":"needs a blank line underneath","commit_id":"fdf194a4d1706d77e533244ea2d8846345a95d25"},{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"6d03bd5090813e4f07993f2bf1c0156f1294b893","unresolved":false,"context_lines":[{"line_number":368,"context_line":""},{"line_number":369,"context_line":"[federation]"},{"line_number":370,"context_line":"#driver \u003d keystone.contrib.federation.backends.sql.Federation"},{"line_number":371,"context_line":"#assertion_prefix \u003d FEDERATION_"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"[ssl]"},{"line_number":374,"context_line":"#enable \u003d True"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"AAAAUX%2F%2Fbjo%3D","line":371,"updated":"2014-02-13 09:09:00.000000000","message":"A short explanation of the assertion_prefix meaning would be great.","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"f3cfc7c03afbe7bfd20f449ec9909e56abddf6a9","unresolved":false,"context_lines":[{"line_number":494,"context_line":"# user_additional_attribute_mapping \u003d"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"[auth]"},{"line_number":497,"context_line":"methods \u003d external,password,token,oauth1,federation"},{"line_number":498,"context_line":"external \u003d keystone.auth.plugins.external.DefaultDomain"},{"line_number":499,"context_line":"password \u003d keystone.auth.plugins.password.Password"},{"line_number":500,"context_line":"token \u003d keystone.auth.plugins.token.Token"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"AAAAUX%2F%2Fc%2Fg%3D","line":497,"updated":"2014-02-13 04:31:06.000000000","message":"why aren\u0027t these commented out?","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f3495a23bab1c1a67ec42356fbd5cbd7a626357","unresolved":false,"context_lines":[{"line_number":494,"context_line":"# user_additional_attribute_mapping \u003d"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"[auth]"},{"line_number":497,"context_line":"methods \u003d external,password,token,oauth1,federation"},{"line_number":498,"context_line":"external \u003d keystone.auth.plugins.external.DefaultDomain"},{"line_number":499,"context_line":"password \u003d keystone.auth.plugins.password.Password"},{"line_number":500,"context_line":"token \u003d keystone.auth.plugins.token.Token"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"AAAAUX%2F%2FcME%3D","line":497,"in_reply_to":"AAAAUX%2F%2Fc%2Fg%3D","updated":"2014-02-13 08:00:21.000000000","message":"These should probably remain commented out and without oauth1 and federation in the is line by default.","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"abbe65555df192d765a5f906b2b8aff701f6f341","unresolved":false,"context_lines":[{"line_number":504,"context_line":"#external \u003d keystone.auth.plugins.external.DefaultDomain"},{"line_number":505,"context_line":"#password \u003d keystone.auth.plugins.password.Password"},{"line_number":506,"context_line":"#token \u003d keystone.auth.plugins.token.Token"},{"line_number":507,"context_line":"#oauth1 \u003d keystone.auth.plugins.oauth1.OAuth"},{"line_number":508,"context_line":"#federation \u003d keystone.auth.plugins.federation.Federation"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"[memcache]"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAUX%2F%2FULQ%3D","line":507,"updated":"2014-02-14 01:33:34.000000000","message":"you don\u0027t have to list these here at all, revert the changes completely.\n\nif anything, give instructions to add it in doc/source/extensions/federation-configuration.rst","commit_id":"be4a8d74c666b6aa6ed05cc6cc4af1c9b0be9907"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"12fb77a5b3585e7cd87e546f2cb3f1d523617356","unresolved":false,"context_lines":[{"line_number":504,"context_line":"#external \u003d keystone.auth.plugins.external.DefaultDomain"},{"line_number":505,"context_line":"#password \u003d keystone.auth.plugins.password.Password"},{"line_number":506,"context_line":"#token \u003d keystone.auth.plugins.token.Token"},{"line_number":507,"context_line":"#oauth1 \u003d keystone.auth.plugins.oauth1.OAuth"},{"line_number":508,"context_line":"#federation \u003d keystone.auth.plugins.federation.Federation"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"[memcache]"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAUX%2F%2FR1g%3D","line":507,"in_reply_to":"AAAAUX%2F%2FULQ%3D","updated":"2014-02-14 09:49:55.000000000","message":"Done","commit_id":"be4a8d74c666b6aa6ed05cc6cc4af1c9b0be9907"}],"etc/policy.v3cloudsample.json":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"33c644250a929ebb012dedb9b8a4d8945ccf5685","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":139,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    \"identity:list_projects_for_groups\": \"\","},{"line_number":142,"context_line":"    \"identity:list_domains_for_groups\": \"\""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"AAAAU3%2F%2Fcyk%3D","line":141,"updated":"2014-02-26 15:22:06.000000000","message":"[] means anyone can do it.  I would like to make it \"rule:admin_required\"  default  here and in cloudsample","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":139,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    \"identity:list_projects_for_groups\": \"\","},{"line_number":142,"context_line":"    \"identity:list_domains_for_groups\": \"\""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"AAAAVX%2F%2F%2FN8%3D","line":141,"in_reply_to":"AAAAU3%2F%2Fcyk%3D","updated":"2014-02-27 00:59:19.000000000","message":"I assume that the resource will actually only be available to a federated user... I think the call will fail with a validation error or something if it\u0027s not.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f244853c5cf9b8e2b774f5c0f62168538365ee3b","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":139,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    \"identity:list_projects_for_groups\": \"\","},{"line_number":142,"context_line":"    \"identity:list_domains_for_groups\": \"\""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"AAAAVX%2F%2F93I%3D","line":141,"in_reply_to":"AAAAVX%2F%2F%2FN8%3D","updated":"2014-02-27 04:45:28.000000000","message":"i assume this is a comment to ayoung, and not a hint to fix something","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                                            \u0027role_id\u0027: r})"},{"line_number":410,"context_line":"            return assignment_list"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def get_roles_for_groups(self, group_ids, session\u003dNone):"},{"line_number":413,"context_line":"        \"\"\"Fetch a set of role ids assigned to the specified groups.\"\"\""},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        def _fetch_roles_from_groups(cls, session):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lEA%3D","line":412,"updated":"2014-02-05 22:23:56.000000000","message":"i think it should be renamed to list_roles_for_groups","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                                            \u0027role_id\u0027: r})"},{"line_number":410,"context_line":"            return assignment_list"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def get_roles_for_groups(self, group_ids, session\u003dNone):"},{"line_number":413,"context_line":"        \"\"\"Fetch a set of role ids assigned to the specified groups.\"\"\""},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        def _fetch_roles_from_groups(cls, session):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iIU%3D","line":412,"in_reply_to":"AAAAUH%2F9lEA%3D","updated":"2014-02-06 09:46:05.000000000","message":"This method is useless now.\nI will remove it.","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f3495a23bab1c1a67ec42356fbd5cbd7a626357","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                        domain_ids.add(domain_grant.domain_id)"},{"line_number":246,"context_line":"            return domain_ids"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        #NOTE(marek-denis): This function is useful in the outer scope, so was"},{"line_number":249,"context_line":"        # move to the class level."},{"line_number":250,"context_line":"        # Suggested refactoring so self._project_ids_to_dicts() is used"},{"line_number":251,"context_line":"        # and removal of the local equivalent."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FcLA%3D","line":248,"updated":"2014-02-13 08:00:21.000000000","message":"++","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f3495a23bab1c1a67ec42356fbd5cbd7a626357","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        \"\"\"List all projects accessible for a member of"},{"line_number":314,"context_line":"        specified groups"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        :param group_ids: list of groups user is member of"},{"line_number":317,"context_line":"        :type: list"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        return: list of dictionarized projects"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FcKk%3D","line":316,"updated":"2014-02-13 08:00:21.000000000","message":"Remove \u0027user is member of\u0027","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f3495a23bab1c1a67ec42356fbd5cbd7a626357","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        \"\"\"List all domains accessible for a member of"},{"line_number":333,"context_line":"        specified groups"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        :param group_ids: list of groups user is member of"},{"line_number":336,"context_line":"        :type: list"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        :returns: list of dictionarized domains"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FcKM%3D","line":335,"updated":"2014-02-13 08:00:21.000000000","message":"Remove \u0027user is member of\u0027","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"            return _project_ids_to_dicts(session, project_ids)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def get_roles_for_groups(self, group_ids, project_id\u003dNone, domain_id\u003dNone):"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        if project_id is not None:"},{"line_number":285,"context_line":"            assignment_type \u003d AssignmentType.GROUP_PROJECT"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F5g%3D","line":282,"updated":"2014-02-22 18:51:36.000000000","message":"only the SQL backend has to support these operations? What about SQL and KVS?\n\nAlso, the new public functions need to be added to the keystone.assignment.Driver as abstract methods.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"            return _project_ids_to_dicts(session, project_ids)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def get_roles_for_groups(self, group_ids, project_id\u003dNone, domain_id\u003dNone):"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        if project_id is not None:"},{"line_number":285,"context_line":"            assignment_type \u003d AssignmentType.GROUP_PROJECT"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F40I%3D","line":282,"in_reply_to":"AAAAU3%2F%2F%2F5g%3D","updated":"2014-02-24 18:57:58.000000000","message":"abstract methods added: \n\n- get_roles_for_groups\n- list_projects_for_groups\n- list_domains_for_groups\n\nalso implemented stubs for ldap and kvs backends.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(\"Must specify either domain or project\")"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        groups \u003d [RoleAssignment.actor_id \u003d\u003d group_id for"},{"line_number":294,"context_line":"                  group_id in group_ids]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F88%3D","line":291,"updated":"2014-02-22 18:51:36.000000000","message":"put string in _() for translation.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(\"Must specify either domain or project\")"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        groups \u003d [RoleAssignment.actor_id \u003d\u003d group_id for"},{"line_number":294,"context_line":"                  group_id in group_ids]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4z4%3D","line":291,"in_reply_to":"AAAAU3%2F%2F%2F88%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(\"Must specify either domain or project\")"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        groups \u003d [RoleAssignment.actor_id \u003d\u003d group_id for"},{"line_number":294,"context_line":"                  group_id in group_ids]"},{"line_number":295,"context_line":"        general_sql_constraints \u003d sql.and_("},{"line_number":296,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2FzFU%3D","line":293,"updated":"2014-02-24 18:57:58.000000000","message":"removed since in_ is now used instead of sql.or_","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        groups \u003d [RoleAssignment.actor_id \u003d\u003d group_id for"},{"line_number":294,"context_line":"                  group_id in group_ids]"},{"line_number":295,"context_line":"        general_sql_constraints \u003d sql.and_("},{"line_number":296,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":297,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":298,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F78%3D","line":295,"updated":"2014-02-22 18:51:36.000000000","message":"remove \"general\" -- what does it mean here?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        groups \u003d [RoleAssignment.actor_id \u003d\u003d group_id for"},{"line_number":294,"context_line":"                  group_id in group_ids]"},{"line_number":295,"context_line":"        general_sql_constraints \u003d sql.and_("},{"line_number":296,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":297,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":298,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F40Y%3D","line":295,"in_reply_to":"AAAAU3%2F%2F%2F78%3D","updated":"2014-02-24 18:57:58.000000000","message":"changed to sql_constraints","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":296,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":297,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":298,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"},{"line_number":299,"context_line":"            sql.or_(*groups))"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        session \u003d db_session.get_session()"},{"line_number":302,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F7g%3D","line":299,"updated":"2014-02-22 18:51:36.000000000","message":"I think this query would give you the same role multiple times, if the role is assigned to multiple groups.\n\nso the query should either have UNIQUE or do a set and list on the results.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":296,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":297,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":298,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"},{"line_number":299,"context_line":"            sql.or_(*groups))"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        session \u003d db_session.get_session()"},{"line_number":302,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F48A%3D","line":299,"in_reply_to":"AAAAU3%2F%2F%2F7g%3D","updated":"2014-02-24 18:57:58.000000000","message":"TBD!\n\nI also changed or_ to in_ and this should actually make the statement more clear.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6a781e843ec8fa144d428a035e4cbc1075a975dd","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                group_sql_conditions).all()"},{"line_number":322,"context_line":"        return [x.to_dict() for x in query]"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def list_accessible_projects(self, group_ids):"},{"line_number":325,"context_line":"        return self._list_entities_for_groups(group_ids, Project)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def list_accessible_domains(self, group_ids):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2FzcA%3D","line":324,"updated":"2014-02-24 18:04:03.000000000","message":"at the driver layer, \"accessible\" doesn\u0027t make sense because there\u0027s no user in context (and no context).\n\nuse the same naming convention used in the other new method call-\n\n  list_projects_for_groups()\n\n  list_domains_for_groups()","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                group_sql_conditions).all()"},{"line_number":322,"context_line":"        return [x.to_dict() for x in query]"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def list_accessible_projects(self, group_ids):"},{"line_number":325,"context_line":"        return self._list_entities_for_groups(group_ids, Project)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def list_accessible_domains(self, group_ids):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fy6k%3D","line":324,"in_reply_to":"AAAAU3%2F%2FzcA%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"63ae9d0d74cd31e665f25ef3f104624688c5694c","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        with session.begin():"},{"line_number":318,"context_line":"            query \u003d session.query(entity).filter("},{"line_number":319,"context_line":"                group_sql_conditions).all()"},{"line_number":320,"context_line":"        return [x.to_dict() for x in query]"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def list_projects_for_groups(self, group_ids):"},{"line_number":323,"context_line":"        return self._list_entities_for_groups(group_ids, Project)"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAU3%2F%2Fwh8%3D","line":320,"updated":"2014-02-24 22:52:37.000000000","message":"(nit) the .all() should really be in L320 rather than L319, since the all() returns a collection, not another query","commit_id":"730d7ebe219f0d82e35ff4124eb8e1f9594cd038"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"88ab0c77bd8e2ef09c6a60ddef347f6a54d49903","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        with session.begin():"},{"line_number":318,"context_line":"            query \u003d session.query(entity).filter("},{"line_number":319,"context_line":"                group_sql_conditions).all()"},{"line_number":320,"context_line":"        return [x.to_dict() for x in query]"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def list_projects_for_groups(self, group_ids):"},{"line_number":323,"context_line":"        return self._list_entities_for_groups(group_ids, Project)"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAU3%2F%2Fwcg%3D","line":320,"in_reply_to":"AAAAU3%2F%2Fwh8%3D","updated":"2014-02-25 00:12:45.000000000","message":"Patchset 37.","commit_id":"730d7ebe219f0d82e35ff4124eb8e1f9594cd038"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":295,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":296,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"},{"line_number":297,"context_line":"            RoleAssignment.actor_id.in_(group_ids))"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        session \u003d db_session.get_session()"},{"line_number":300,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv8I%3D","line":297,"updated":"2014-02-25 00:44:41.000000000","message":"I think this query would give you the same role multiple times, if the role is assigned to multiple groups.\n\nso the query should either have UNIQUE or do a set and list on the results.\n\n(copying from earlier since this was TBD)","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":295,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":296,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"},{"line_number":297,"context_line":"            RoleAssignment.actor_id.in_(group_ids))"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        session \u003d db_session.get_session()"},{"line_number":300,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fuk4%3D","line":297,"in_reply_to":"AAAAU3%2F%2Fv8I%3D","updated":"2014-02-25 03:54:24.000000000","message":"leaving this tbd","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1952e55f192037f0d3cfdde2486c6d60700de05a","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":295,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":296,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"},{"line_number":297,"context_line":"            RoleAssignment.actor_id.in_(group_ids))"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        session \u003d db_session.get_session()"},{"line_number":300,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2FuJ0%3D","line":297,"updated":"2014-02-25 04:04:00.000000000","message":"copying from previous patch:\n\nI think this query would give you the same role multiple times, if the role is assigned to multiple groups.\nso the query should either have UNIQUE or do a set and list on the results.","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"31609b46d9767f0bd51e6dde8ebf936e31c7d600","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            RoleAssignment.type \u003d\u003d assignment_type,"},{"line_number":295,"context_line":"            RoleAssignment.target_id \u003d\u003d target_id,"},{"line_number":296,"context_line":"            Role.id \u003d\u003d RoleAssignment.role_id,"},{"line_number":297,"context_line":"            RoleAssignment.actor_id.in_(group_ids))"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        session \u003d db_session.get_session()"},{"line_number":300,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2Fn3s%3D","line":297,"in_reply_to":"AAAAU3%2F%2FuJ0%3D","updated":"2014-02-25 16:51:46.000000000","message":"addded .distinct()","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f7a70f1834318fc05c03bffccf51c0a529c7d700","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            target_id \u003d project_id"},{"line_number":287,"context_line":"        elif domain_id is not None:"},{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(_(\"Must specify either domain or project\"))"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2Fh34%3D","line":289,"updated":"2014-02-26 04:26:09.000000000","message":"Should these checks live in the Manager before handing down to the backends? If so these method could be copied into the Manager. I think they are just in Driver right now?","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4214f60c1f5a825317cc56c567d0e02a95a966f3","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            target_id \u003d project_id"},{"line_number":287,"context_line":"        elif domain_id is not None:"},{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(_(\"Must specify either domain or project\"))"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2Fc5U%3D","line":289,"in_reply_to":"AAAAU3%2F%2FdTI%3D","updated":"2014-02-26 15:10:15.000000000","message":"Fair enough, good to know.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"33c644250a929ebb012dedb9b8a4d8945ccf5685","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            target_id \u003d project_id"},{"line_number":287,"context_line":"        elif domain_id is not None:"},{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(_(\"Must specify either domain or project\"))"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FdIY%3D","line":289,"in_reply_to":"AAAAU3%2F%2FdTI%3D","updated":"2014-02-26 15:22:06.000000000","message":"OK as is.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"072125860a39e12656eda184b9b9d1d1b7be187c","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            target_id \u003d project_id"},{"line_number":287,"context_line":"        elif domain_id is not None:"},{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(_(\"Must specify either domain or project\"))"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FdTI%3D","line":289,"in_reply_to":"AAAAU3%2F%2FdXo%3D","updated":"2014-02-26 14:25:04.000000000","message":"I don\u0027t think this code should be moved to the manager. Only the SQL backend knows about AssignmentType at this point, and I think it should stay that way.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3512c4e31d046d5cec3b3a49d56c7c9e49656e5","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            target_id \u003d project_id"},{"line_number":287,"context_line":"        elif domain_id is not None:"},{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(_(\"Must specify either domain or project\"))"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FdXo%3D","line":289,"in_reply_to":"AAAAU3%2F%2FdZ8%3D","updated":"2014-02-26 14:14:52.000000000","message":"yeah, just thinking that the Manager could take care of this and just pass the correct assignment type to the driver? Just an idea though.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7bf2d5a8dc3ed3309a0d69ddabb3e84262b3a3b3","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            target_id \u003d project_id"},{"line_number":287,"context_line":"        elif domain_id is not None:"},{"line_number":288,"context_line":"            assignment_type \u003d AssignmentType.GROUP_DOMAIN"},{"line_number":289,"context_line":"            target_id \u003d domain_id"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            raise AttributeError(_(\"Must specify either domain or project\"))"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FdZ8%3D","line":289,"in_reply_to":"AAAAU3%2F%2Fh34%3D","updated":"2014-02-26 14:10:12.000000000","message":"so, basically you suggest moving logic for choosing the right assignment_type and so on to the Manager layer, instead of the db layer or the purpose of moving it is slightly different?\n\n@dolph, @stevemar, @bknudson - any hints, comments on that?","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b421b4511e4d376901790caceb7af49836d69b26","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            except KeyError:"},{"line_number":373,"context_line":"                return groups_ref"},{"line_number":374,"context_line":"            else:"},{"line_number":375,"context_line":"                return [g[\u0027id\u0027] for g in groups_ref]"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        token \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":378,"context_line":"        group_ids \u003d _fetch_group_ids_from_token(token)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJv8%3D","line":375,"updated":"2014-02-15 23:06:01.000000000","message":"python!\n\n  group_ids \u003d [g[\u0027id\u0027] for g in token[\u0027user\u0027].get(\u0027groups\u0027, [])]","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b421b4511e4d376901790caceb7af49836d69b26","unresolved":false,"context_lines":[{"line_number":446,"context_line":"            else:"},{"line_number":447,"context_line":"                return [g[\u0027id\u0027] for g in groups_ref]"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        token \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":450,"context_line":"        group_ids \u003d _fetch_group_ids_from_token(token)"},{"line_number":451,"context_line":"        projects \u003d self.assignment_api.list_projects_for_groups(group_ids)"},{"line_number":452,"context_line":"        return ProjectV3.wrap_collection(context, projects)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJv0%3D","line":449,"updated":"2014-02-15 23:06:01.000000000","message":"should just be getting groups out of context, not the token itself","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"}],"keystone/assignment/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":830,"context_line":""},{"line_number":831,"context_line":"    @abc.abstractmethod"},{"line_number":832,"context_line":"    def get_roles_for_groups(self, group_ids, project_id\u003dNone, domain_id\u003dNone):"},{"line_number":833,"context_line":"        \"\"\"List all the roles matching group ids and either domain_id or"},{"line_number":834,"context_line":"        project_id."},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        If the project_id is not None, this value will be used, no matter what"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv6w%3D","line":833,"updated":"2014-02-25 00:44:41.000000000","message":"suggest change \"matching\" to \"assigned to\"\n\nchange \"group ids\" to \"groups\", \"domain_id\" to \"domain\" and \"project_id\" to \"project\"","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":830,"context_line":""},{"line_number":831,"context_line":"    @abc.abstractmethod"},{"line_number":832,"context_line":"    def get_roles_for_groups(self, group_ids, project_id\u003dNone, domain_id\u003dNone):"},{"line_number":833,"context_line":"        \"\"\"List all the roles matching group ids and either domain_id or"},{"line_number":834,"context_line":"        project_id."},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        If the project_id is not None, this value will be used, no matter what"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fujk%3D","line":833,"in_reply_to":"AAAAU3%2F%2Fv6w%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":837,"context_line":"        was specified in the domain_id."},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        :param group_ids: iterable with group ids"},{"line_number":840,"context_line":"        :param project_id: id of the matching project"},{"line_number":841,"context_line":"        :param domain_id: id of the matcing domain"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        :raises: AttributeError: In case both project_id and domain_id are set"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv6A%3D","line":840,"updated":"2014-02-25 00:44:41.000000000","message":"suggest remove \"matching\" -- I don\u0027t know what a matching project is.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":837,"context_line":"        was specified in the domain_id."},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        :param group_ids: iterable with group ids"},{"line_number":840,"context_line":"        :param project_id: id of the matching project"},{"line_number":841,"context_line":"        :param domain_id: id of the matcing domain"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        :raises: AttributeError: In case both project_id and domain_id are set"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fujo%3D","line":840,"in_reply_to":"AAAAU3%2F%2Fv6A%3D","updated":"2014-02-25 03:54:24.000000000","message":"removed","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        :param group_ids: iterable with group ids"},{"line_number":840,"context_line":"        :param project_id: id of the matching project"},{"line_number":841,"context_line":"        :param domain_id: id of the matcing domain"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        :raises: AttributeError: In case both project_id and domain_id are set"},{"line_number":844,"context_line":"                                 to None"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv6U%3D","line":841,"updated":"2014-02-25 00:44:41.000000000","message":"change \"matcing\" to \"matching\", or just remove it.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        :param group_ids: iterable with group ids"},{"line_number":840,"context_line":"        :param project_id: id of the matching project"},{"line_number":841,"context_line":"        :param domain_id: id of the matcing domain"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        :raises: AttributeError: In case both project_id and domain_id are set"},{"line_number":844,"context_line":"                                 to None"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fujs%3D","line":841,"in_reply_to":"AAAAU3%2F%2Fv6U%3D","updated":"2014-02-25 03:54:24.000000000","message":"removed","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":851,"context_line":""},{"line_number":852,"context_line":"    @abc.abstractmethod"},{"line_number":853,"context_line":"    def list_projects_for_groups(self, group_ids):"},{"line_number":854,"context_line":"        \"\"\"List projects accessible from specified groups."},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        :param group_ids: List of group ids the user is member of."},{"line_number":857,"context_line":"        :returns: List of projects accessible from specified groups."}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv7A%3D","line":854,"updated":"2014-02-25 00:44:41.000000000","message":"change \"accessible from\" to \"accessible to\" -- also applies to 857, 864, 866.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":851,"context_line":""},{"line_number":852,"context_line":"    @abc.abstractmethod"},{"line_number":853,"context_line":"    def list_projects_for_groups(self, group_ids):"},{"line_number":854,"context_line":"        \"\"\"List projects accessible from specified groups."},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        :param group_ids: List of group ids the user is member of."},{"line_number":857,"context_line":"        :returns: List of projects accessible from specified groups."}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fuis%3D","line":854,"in_reply_to":"AAAAU3%2F%2Fv7A%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":853,"context_line":"    def list_projects_for_groups(self, group_ids):"},{"line_number":854,"context_line":"        \"\"\"List projects accessible from specified groups."},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        :param group_ids: List of group ids the user is member of."},{"line_number":857,"context_line":"        :returns: List of projects accessible from specified groups."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv7w%3D","line":856,"updated":"2014-02-25 00:44:41.000000000","message":"what user? suggest remove \" the user is member of\" -- also applies to line 866.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":853,"context_line":"    def list_projects_for_groups(self, group_ids):"},{"line_number":854,"context_line":"        \"\"\"List projects accessible from specified groups."},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        :param group_ids: List of group ids the user is member of."},{"line_number":857,"context_line":"        :returns: List of projects accessible from specified groups."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fuiw%3D","line":856,"in_reply_to":"AAAAU3%2F%2Fv7w%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":854,"context_line":"        \"\"\"List projects accessible from specified groups."},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        :param group_ids: List of group ids the user is member of."},{"line_number":857,"context_line":"        :returns: List of projects accessible from specified groups."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        \"\"\""},{"line_number":860,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv7Q%3D","line":857,"updated":"2014-02-25 00:44:41.000000000","message":"change \"accessible from\" to \"accessible to\".","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":854,"context_line":"        \"\"\"List projects accessible from specified groups."},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        :param group_ids: List of group ids the user is member of."},{"line_number":857,"context_line":"        :returns: List of projects accessible from specified groups."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        \"\"\""},{"line_number":860,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fui0%3D","line":857,"in_reply_to":"AAAAU3%2F%2Fv7Q%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"}],"keystone/assignment/routers.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dada69a3eda415ce411bf71d417e2dad568fd0bc","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    routers.append("},{"line_number":63,"context_line":"        router.Router(domain_controller,"},{"line_number":64,"context_line":"                      \u0027domains\u0027, \u0027domain\u0027))"},{"line_number":65,"context_line":"    mapper.connect(\u0027/groups/domains\u0027,"},{"line_number":66,"context_line":"                   controller\u003ddomain_controller,"},{"line_number":67,"context_line":"                   action\u003d\u0027list_domains_for_groups\u0027,"},{"line_number":68,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F0GA%3D","line":65,"updated":"2014-02-10 16:59:53.000000000","message":"Need some help with proper URLs.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dada69a3eda415ce411bf71d417e2dad568fd0bc","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                   action\u003d\u0027list_user_projects\u0027,"},{"line_number":77,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    mapper.connect(\u0027/groups/projects\u0027,"},{"line_number":80,"context_line":"                   controller\u003dproject_controller,"},{"line_number":81,"context_line":"                   action\u003d\u0027list_projects_for_groups\u0027,"},{"line_number":82,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F0GI%3D","line":79,"updated":"2014-02-10 16:59:53.000000000","message":"Need some help with proper URLs.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f3495a23bab1c1a67ec42356fbd5cbd7a626357","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    routers.append("},{"line_number":63,"context_line":"        router.Router(domain_controller,"},{"line_number":64,"context_line":"                      \u0027domains\u0027, \u0027domain\u0027))"},{"line_number":65,"context_line":"    mapper.connect(\u0027/groups/domains\u0027,"},{"line_number":66,"context_line":"                   controller\u003ddomain_controller,"},{"line_number":67,"context_line":"                   action\u003d\u0027list_domains_for_groups\u0027,"},{"line_number":68,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FcFw%3D","line":65,"updated":"2014-02-13 08:00:21.000000000","message":"Why would specifying a single group not work?","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b421b4511e4d376901790caceb7af49836d69b26","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    mapper.connect(\u0027/groups/domains\u0027,"},{"line_number":66,"context_line":"                   controller\u003ddomain_controller,"},{"line_number":67,"context_line":"                   action\u003d\u0027list_domains_for_groups\u0027,"},{"line_number":68,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    project_controller \u003d controllers.ProjectV3()"},{"line_number":71,"context_line":"    routers.append("}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJu4%3D","line":68,"updated":"2014-02-15 23:06:01.000000000","message":"what is this? driver methods don\u0027t need to be exposed to the API","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b421b4511e4d376901790caceb7af49836d69b26","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    mapper.connect(\u0027/groups/projects\u0027,"},{"line_number":80,"context_line":"                   controller\u003dproject_controller,"},{"line_number":81,"context_line":"                   action\u003d\u0027list_projects_for_groups\u0027,"},{"line_number":82,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    role_controller \u003d controllers.RoleV3()"},{"line_number":85,"context_line":"    routers.append(router.Router(role_controller, \u0027roles\u0027, \u0027role\u0027))"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJu0%3D","line":82,"updated":"2014-02-15 23:06:01.000000000","message":"??","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"}],"keystone/auth/controllers.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f07db3347e7c07925bc419119a150bb253a9944a","unresolved":false,"context_lines":[{"line_number":392,"context_line":"    def authenticate_unscoped_federation(self, context, idp, protocol):"},{"line_number":393,"context_line":"        federation \u003d get_auth_method(\u0027federation\u0027)"},{"line_number":394,"context_line":"        token_data \u003d federation.get_unscoped_token(context, idp, protocol)"},{"line_number":395,"context_line":"        auth_methods \u003d [protocol]"},{"line_number":396,"context_line":"        token_id, token \u003d self.token_provider_api.unscoped_federation_token("},{"line_number":397,"context_line":"            token_data, auth_methods\u003dauth_methods)"},{"line_number":398,"context_line":"        return render_token_data_response(token_id, token, created\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIuc%3D","line":395,"updated":"2014-02-16 13:47:27.000000000","message":"actually this value is questionable here.\nWhat\u0027s the point in putting saml2/openid/whatever in here since we later expect  value \u0027federation\u0027 to fire up appropriate auth plugin?\nI did change it to \u0027federation\u0027. Feel free to revert that change.","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1dd72a8bd565b8ed053fe9740844b248ec0a3b07","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                              \u0027project_id\u0027: default_project_id})"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def authenticate_unscoped_federation(self, context, idp, protocol):"},{"line_number":393,"context_line":"        federation \u003d get_auth_method(\u0027federation\u0027)"},{"line_number":394,"context_line":"        token_data \u003d federation.get_unscoped_token(context, idp, protocol)"},{"line_number":395,"context_line":"        token_id, token \u003d self.token_provider_api.unscoped_federation_token("},{"line_number":396,"context_line":"            token_data)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FG6s%3D","line":393,"updated":"2014-02-17 03:53:42.000000000","message":"This should be SAML, not Federation.  Federation is not a method, SAML is.  Federation is a body of related technologies.  Remove Protocol from the message signature, put it in the body of the request, and drop \"federation \" from the method name, and you can use the Authenticate call below.","commit_id":"4936e264fffea338bd79b5106093d4b99b60b9e2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2f366747127d63016cac59c436d93805d11e79b9","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            # scope is specified"},{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # fill in default_project_id if it is available"},{"line_number":347,"context_line":"        try:"},{"line_number":348,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":349,"context_line":"        except exception.UserNotFound as e:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FBxE%3D","line":346,"updated":"2014-02-17 15:13:35.000000000","message":"delete this comment - it\u0027s redundant with the code","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bb4f3e48e2042694ad2d8e8fc09fd30dbd820c9a","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            # scope is specified"},{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # fill in default_project_id if it is available"},{"line_number":347,"context_line":"        try:"},{"line_number":348,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":349,"context_line":"        except exception.UserNotFound as e:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2B%2FCU%3D","line":346,"in_reply_to":"AAAAUX%2F%2FBxE%3D","updated":"2014-02-17 20:12:11.000000000","message":"Done","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2f366747127d63016cac59c436d93805d11e79b9","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        try:"},{"line_number":348,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":349,"context_line":"        except exception.UserNotFound as e:"},{"line_number":350,"context_line":"            LOG.exception(e)"},{"line_number":351,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":352,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":353,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FBxQ%3D","line":350,"updated":"2014-02-17 15:13:35.000000000","message":"this shouldn\u0027t log an exception anymore, then","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bb4f3e48e2042694ad2d8e8fc09fd30dbd820c9a","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        try:"},{"line_number":348,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":349,"context_line":"        except exception.UserNotFound as e:"},{"line_number":350,"context_line":"            LOG.exception(e)"},{"line_number":351,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":352,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":353,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2B%2FCM%3D","line":350,"in_reply_to":"AAAAUX%2F%2FBxQ%3D","updated":"2014-02-17 20:12:11.000000000","message":"Done","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            # scope is specified"},{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        try:"},{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F4s%3D","line":346,"updated":"2014-02-22 18:51:36.000000000","message":"why was the comment on the previous line removed? it was\n\n # fill in default_project_id if it is available\n\nthis seems to still apply, the code below fills in the default project if it\u0027s available.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            # scope is specified"},{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        try:"},{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4qo%3D","line":346,"in_reply_to":"AAAAU3%2F%2F%2F4s%3D","updated":"2014-02-24 18:57:58.000000000","message":"comment added back.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6069a2084d8f3206fa1763c97d1069ad3dc6843b","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        try:"},{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BR3M%3D","line":349,"updated":"2014-02-22 16:06:08.000000000","message":"Good comment!  But is there not code somewhere that previously was relying on this code to generate the raise exception.Unauthorized?  How do you know this won\u0027t break anything?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        try:"},{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUv0%3D","line":349,"updated":"2014-02-23 14:37:20.000000000","message":"Since this is longer an error do we still need to figure out a scope?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        try:"},{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4rA%3D","line":349,"in_reply_to":"AAAAUX%2F%2BR3M%3D","updated":"2014-02-24 18:57:58.000000000","message":"Brad, if you can think of such situation, it\u0027s probably a good time to shout it out now.\nAll the tests are however passing so I guess it doesn\u0027t break any obvious use-cases.\nHowever, I reverted exception.Unauthorized() case.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        default_project_id \u003d user_ref.get(\u0027default_project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F5A%3D","line":350,"updated":"2014-02-22 18:51:36.000000000","message":"Clarify what \"it\" refers to here -- I assume it\u0027s the user.\n\nIsn\u0027t this function called in the non-federation case too? Seems like we should continue to raise an exception in the non-federated case.\n\nnot only do we not raise an exception we don\u0027t continue on. The comment should explain why it\u0027s ok to just return here.\n\nwhy can\u0027t federated users have a default project? seems like they should be able to have one.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        default_project_id \u003d user_ref.get(\u0027default_project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4ec%3D","line":350,"in_reply_to":"AAAAU3%2F%2F%2F5A%3D","updated":"2014-02-24 18:57:58.000000000","message":"1) I assume \u0027it\u0027 meant user object in the Identity backend.\n2) Yes, this function is called also in the non-federated case, you suggestion to distinguish.\n3) I changed _check_and_set_default_scoping()  so now:\n   *) function exits when \u0027saml2\u0027 is one of the authn methods\n   *) raises exception.Unauthorized() exception in all the other cases (I\u0027d call them - the typical ones)\n\n\nIf we wanted to automatically assign federated users  default projects we should keep this information either in the IdentityProviderModel objects or ProtocolModel, right? I\u0027d be very reluctant to assign every federated user to the very same project.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        default_project_id \u003d user_ref.get(\u0027default_project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0No%3D","line":350,"in_reply_to":"AAAAU3%2F%2F%2F5A%3D","updated":"2014-02-24 17:26:34.000000000","message":"Could change the return to a pass, this would allow us to check if the user has a default project","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6a781e843ec8fa144d428a035e4cbc1075a975dd","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":348,"context_line":"        except exception.UserNotFound:"},{"line_number":349,"context_line":"            # NOTE(stevemar): Now with federation, we shouldn\u0027t raise an"},{"line_number":350,"context_line":"            # exception since it won\u0027t be in identity"},{"line_number":351,"context_line":"            return"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        default_project_id \u003d user_ref.get(\u0027default_project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fzas%3D","line":350,"in_reply_to":"AAAAU3%2F%2F0No%3D","updated":"2014-02-24 18:04:03.000000000","message":"if you change it to a pass, then the rest of this code will fail","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            # scope is specified"},{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        #Skip if we are authenticating federated user"},{"line_number":347,"context_line":"        if \u0027saml2\u0027 in auth_info.get_method_names():"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv5s%3D","line":346,"updated":"2014-02-25 00:44:41.000000000","message":"add a space after # to match the format for comments used throughout this file.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            # scope is specified"},{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        #Skip if we are authenticating federated user"},{"line_number":347,"context_line":"        if \u0027saml2\u0027 in auth_info.get_method_names():"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fuik%3D","line":346,"in_reply_to":"AAAAU3%2F%2Fv5s%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        #Skip if we are authenticating federated user"},{"line_number":347,"context_line":"        if \u0027saml2\u0027 in auth_info.get_method_names():"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvwA%3D","line":347,"updated":"2014-02-25 00:44:41.000000000","message":"there must be a better way to check if it\u0027s a federated user -- how about set something in the auth_context?","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        #Skip if we are authenticating federated user"},{"line_number":347,"context_line":"        if \u0027saml2\u0027 in auth_info.get_method_names():"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuiQ%3D","line":347,"in_reply_to":"AAAAU3%2F%2FvwA%3D","updated":"2014-02-25 03:54:24.000000000","message":"investigating...","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        try:"},{"line_number":352,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":353,"context_line":"        except exception.UserNotFound as e:"},{"line_number":354,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        default_project_id \u003d user_ref.get(\u0027default_project_id\u0027)"},{"line_number":357,"context_line":"        if not default_project_id:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvw8%3D","line":354,"updated":"2014-02-25 00:44:41.000000000","message":"revert the change on the previous line since it\u0027s not related.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        try:"},{"line_number":352,"context_line":"            user_ref \u003d self.identity_api.get_user(auth_context[\u0027user_id\u0027])"},{"line_number":353,"context_line":"        except exception.UserNotFound as e:"},{"line_number":354,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        default_project_id \u003d user_ref.get(\u0027default_project_id\u0027)"},{"line_number":357,"context_line":"        if not default_project_id:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuiY%3D","line":354,"in_reply_to":"AAAAU3%2F%2Fvw8%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1952e55f192037f0d3cfdde2486c6d60700de05a","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # Skip if we are authenticating federated user"},{"line_number":347,"context_line":"        if \u0027saml2\u0027 in auth_info.get_method_names():"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2FuKE%3D","line":347,"updated":"2014-02-25 04:04:00.000000000","message":"copying from previous patch set...\nthere must be a better way to check if it\u0027s a federated user -- how about set something in the auth_context?","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"31609b46d9767f0bd51e6dde8ebf936e31c7d600","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # Skip if we are authenticating federated user"},{"line_number":347,"context_line":"        if \u0027saml2\u0027 in auth_info.get_method_names():"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2FncQ%3D","line":347,"in_reply_to":"AAAAU3%2F%2FuKE%3D","updated":"2014-02-25 16:51:46.000000000","message":"see patchset 39.","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"04fb355816b4037934587cce7ce5fc7db6700807","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # Skip if we are told to do so"},{"line_number":347,"context_line":"        if auth_context.get(\u0027skip_default_scoping\u0027, False) is True:"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAU3%2F%2FmG8%3D","line":347,"updated":"2014-02-25 18:47:26.000000000","message":"if we had a federation section in \u0027extras\u0027 we could just query that... and get rid of this whole skip scoping business","commit_id":"1abaf1603971a8cbc07f96c5e30cfbeb828f12f2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # Skip scoping in the case of federation"},{"line_number":347,"context_line":"        if auth_context.get(\u0027OS-FEDERATION:identity_provider\u0027):"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FH0%3D","line":347,"updated":"2014-02-27 00:59:19.000000000","message":"suggest use \n\n if \u0027OS-FEDERATION:identity_provider\u0027 in auth_context:\n\nThis code shouldn\u0027t care if it\u0027s an empty dict or whatever.\n\nwould be nice if the \"OS-FEDERATION:identity_provider\" string was defined as a constant somewhere rather than re-typing it everywhere.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f244853c5cf9b8e2b774f5c0f62168538365ee3b","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # Skip scoping in the case of federation"},{"line_number":347,"context_line":"        if auth_context.get(\u0027OS-FEDERATION:identity_provider\u0027):"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F93A%3D","line":347,"in_reply_to":"AAAAVX%2F%2F%2FH0%3D","updated":"2014-02-27 04:45:28.000000000","message":"could put that it as a constant in contrib.federation.core.py","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            return"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        # Skip scoping in the case of federation"},{"line_number":347,"context_line":"        if auth_context.get(\u0027OS-FEDERATION:identity_provider\u0027):"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # fill in default_project_id if it is available"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7jM%3D","line":347,"in_reply_to":"AAAAVX%2F%2F93A%3D","updated":"2014-02-27 13:17:45.000000000","message":"string constant in contrib.federation.IDENITTY_PROVIDER","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}],"keystone/auth/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                       a dictionary."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":41,"context_line":"        Plugin ``saml2`` additionally sets ``group_ids`` and"},{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvtQ%3D","line":41,"updated":"2014-02-25 00:44:41.000000000","message":"this class shouldn\u0027t have to know anything about its subclasses, if it does then that\u0027s a design problem.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                       a dictionary."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":41,"context_line":"        Plugin ``saml2`` additionally sets ``group_ids`` and"},{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fuac%3D","line":41,"in_reply_to":"AAAAU3%2F%2FvtQ%3D","updated":"2014-02-25 03:54:24.000000000","message":"I moved all of this to the plugin\u0027s authenticate method","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":41,"context_line":"        Plugin ``saml2`` additionally sets ``group_ids`` and"},{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"},{"line_number":45,"context_line":"        ``federated_token``. This entry stores unscoped token."}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvuk%3D","line":42,"updated":"2014-02-25 00:44:41.000000000","message":"suggest put these all in a single attribute, e.g., \n\n {\n     \"federation\": {\"group_ids\": [], \"identity_provider\": \"\", \"protocol\": \"\"\n }","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b3e7965334c01411f82b4531f8e306235f0536d8","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":41,"context_line":"        Plugin ``saml2`` additionally sets ``group_ids`` and"},{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"},{"line_number":45,"context_line":"        ``federated_token``. This entry stores unscoped token."}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FleM%3D","line":42,"in_reply_to":"AAAAU3%2F%2Fvuk%3D","updated":"2014-02-25 19:43:28.000000000","message":"agree that the federation specific ones could be namespaced, but i\u0027d prefer a flat dictionary and use the actual extension ID as the standard prefix \"OS-FEDERATION:identity_provider_id\" and \"OS-FEDERATION:protocol_id\"\n\ngroups are a core concept, and although they\u0027re introduced here by federation, i\u0027d rather not make their usage dependent on the presence of federation, so i\u0027d prefer they stay as \"group_ids\" in context","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":41,"context_line":"        Plugin ``saml2`` additionally sets ``group_ids`` and"},{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"},{"line_number":45,"context_line":"        ``federated_token``. This entry stores unscoped token."},{"line_number":46,"context_line":"        ``method_name`` is used to convey any additional authentication methods"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv5I%3D","line":43,"updated":"2014-02-25 00:44:41.000000000","message":"add \"an\" -- \"issuing an unscoped\"","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":41,"context_line":"        Plugin ``saml2`` additionally sets ``group_ids`` and"},{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"},{"line_number":45,"context_line":"        ``federated_token``. This entry stores unscoped token."},{"line_number":46,"context_line":"        ``method_name`` is used to convey any additional authentication methods"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuYg%3D","line":43,"in_reply_to":"AAAAU3%2F%2Fv5I%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"},{"line_number":45,"context_line":"        ``federated_token``. This entry stores unscoped token."},{"line_number":46,"context_line":"        ``method_name`` is used to convey any additional authentication methods"},{"line_number":47,"context_line":"        in case authentication is for re-scoping. For example, if the"},{"line_number":48,"context_line":"        authentication is for re-scoping, plugin must append the previous"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv40%3D","line":45,"updated":"2014-02-25 00:44:41.000000000","message":"add \"the\" -- \"stores the unscoped token\"","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        ``identity_provider`` and ``protocol`` in the ``auth_context``,"},{"line_number":43,"context_line":"        values required for issuing unscoped federated token."},{"line_number":44,"context_line":"        During scoping of the federated tokens, plugin sets"},{"line_number":45,"context_line":"        ``federated_token``. This entry stores unscoped token."},{"line_number":46,"context_line":"        ``method_name`` is used to convey any additional authentication methods"},{"line_number":47,"context_line":"        in case authentication is for re-scoping. For example, if the"},{"line_number":48,"context_line":"        authentication is for re-scoping, plugin must append the previous"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuYk%3D","line":45,"in_reply_to":"AAAAU3%2F%2Fv40%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    \"password\","},{"line_number":58,"context_line":"                    \"token\""},{"line_number":59,"context_line":"                ],"},{"line_number":60,"context_line":"                \"user_id\": \"abc123\""},{"line_number":61,"context_line":"            }"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        Plugins are invoked in the order in which they are specified in the"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvuE%3D","line":60,"updated":"2014-02-25 00:44:41.000000000","message":"would be useful to also provide an example for the 2 federated token cases.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    \"password\","},{"line_number":58,"context_line":"                    \"token\""},{"line_number":59,"context_line":"                ],"},{"line_number":60,"context_line":"                \"user_id\": \"abc123\""},{"line_number":61,"context_line":"            }"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        Plugins are invoked in the order in which they are specified in the"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fug0%3D","line":60,"in_reply_to":"AAAAU3%2F%2FvuE%3D","updated":"2014-02-25 03:54:24.000000000","message":"this seems like it would overload this doc string? I think in the custom plugin would be a better spot for it. \nAdditionally, I think the doc changes made above should go there too. \n\nWhat do you think?","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                \"auth\": {"},{"line_number":70,"context_line":"                    \"identity\": {"},{"line_number":71,"context_line":"                        \"custom-plugin\": {"},{"line_number":72,"context_line":"                            \"custom-data\": \"some_data\""},{"line_number":73,"context_line":"                        },"},{"line_number":74,"context_line":"                        \"methods\": ["},{"line_number":75,"context_line":"                            \"custom-plugin\","}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvvs%3D","line":72,"updated":"2014-02-25 00:44:41.000000000","message":"revert this change, it\u0027s unrelated.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                \"auth\": {"},{"line_number":70,"context_line":"                    \"identity\": {"},{"line_number":71,"context_line":"                        \"custom-plugin\": {"},{"line_number":72,"context_line":"                            \"custom-data\": \"some_data\""},{"line_number":73,"context_line":"                        },"},{"line_number":74,"context_line":"                        \"methods\": ["},{"line_number":75,"context_line":"                            \"custom-plugin\","}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuhU%3D","line":72,"in_reply_to":"AAAAU3%2F%2Fvvs%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"}],"keystone/auth/plugins/federation.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0158582e0929d35706253c957d8769ad2c1f6216","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJuU%3D","line":1,"updated":"2014-02-15 23:12:13.000000000","message":"these can be removed","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0158582e0929d35706253c957d8769ad2c1f6216","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJuY%3D","line":3,"updated":"2014-02-15 23:12:13.000000000","message":"don\u0027t assign copyright to the foundation -- we don\u0027t work for them","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0158582e0929d35706253c957d8769ad2c1f6216","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        if expires_at:"},{"line_number":35,"context_line":"            now \u003d timeutils.utcnow()"},{"line_number":36,"context_line":"#            expires \u003d timeutils.normalize_time("},{"line_number":37,"context_line":"#                timeutils.parse_isotime(expires_at))"},{"line_number":38,"context_line":"            if now \u003e expires_at:"},{"line_number":39,"context_line":"                raise exception.Unauthorized(_(\u0027Access token is expired\u0027))"},{"line_number":40,"context_line":"        return expires_at"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJuM%3D","line":37,"updated":"2014-02-15 23:12:13.000000000","message":"keep commented out code out of gerrit ;)","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2474756723ae53de4bb7bec182369c9c47fea69d","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@dependency.requires(\u0027token_api\u0027)"},{"line_number":24,"context_line":"class Federation(auth.AuthMethodHandler):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2FJbA%3D","line":21,"updated":"2014-02-16 04:13:22.000000000","message":"I will change this file to handle all federation auth, scoped or unscoped.","commit_id":"a5719044a3879defdb3939ea3aba163d37d88e84"}],"keystone/auth/plugins/saml2.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2f366747127d63016cac59c436d93805d11e79b9","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":42,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":43,"context_line":"        auth_context[\u0027expires_at\u0027] \u003d self._validate_expiration(token_ref)"},{"line_number":44,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"},{"line_number":45,"context_line":"        auth_context[\u0027federated_token\u0027] \u003d token_ref"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FBu8%3D","line":43,"updated":"2014-02-17 15:13:35.000000000","message":"why does this need to be in auth_context ?","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bb4f3e48e2042694ad2d8e8fc09fd30dbd820c9a","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":42,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":43,"context_line":"        auth_context[\u0027expires_at\u0027] \u003d self._validate_expiration(token_ref)"},{"line_number":44,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"},{"line_number":45,"context_line":"        auth_context[\u0027federated_token\u0027] \u003d token_ref"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2B%2FBk%3D","line":43,"in_reply_to":"AAAAUX%2F%2FBu8%3D","updated":"2014-02-17 20:12:11.000000000","message":"removed it, and tweaked the validate call a bit","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2f366747127d63016cac59c436d93805d11e79b9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        mapped_properties \u003d utils.map_assertion(context)"},{"line_number":50,"context_line":"        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":51,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":52,"context_line":"        auth_context[\u0027groups\u0027] \u003d self._refactor_group_ids("},{"line_number":53,"context_line":"            mapped_properties[\u0027group_ids\u0027])"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def _get_assertion_params_from_env(self, context):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FBwQ%3D","line":52,"updated":"2014-02-17 15:13:35.000000000","message":"[\u0027group_ids\u0027]","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bb4f3e48e2042694ad2d8e8fc09fd30dbd820c9a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        mapped_properties \u003d utils.map_assertion(context)"},{"line_number":50,"context_line":"        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":51,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":52,"context_line":"        auth_context[\u0027groups\u0027] \u003d self._refactor_group_ids("},{"line_number":53,"context_line":"            mapped_properties[\u0027group_ids\u0027])"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def _get_assertion_params_from_env(self, context):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2B%2FBg%3D","line":52,"in_reply_to":"AAAAUX%2F%2FBwQ%3D","updated":"2014-02-17 20:12:11.000000000","message":"Done","commit_id":"222a12091a4f3ae5251e8563917e50f55ccf9d79"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c6b9f26f9db4d933bde1d38f92778e4f7a1c9aa","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":62,"context_line":"        user_id \u003d mapped_properties.get(\u0027name\u0027)"},{"line_number":63,"context_line":"        if user_id is None:"},{"line_number":64,"context_line":"            user_id \u003d self.random_user(identity_provider)"},{"line_number":65,"context_line":"        auth_context[\u0027user_id\u0027] \u003d user_id"},{"line_number":66,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":67,"context_line":"#    def _handle_unscoped_token(self, context, auth_info, auth_context):"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2Braw%3D","line":64,"updated":"2014-02-19 20:42:48.000000000","message":"do NOT make up user ID\u0027s like this.\n\neither a 401 needs to be raised as a result of a the rule processor not returning a user name, or we need to be able to handle null user_id\u0027s, which is what I\u0027d actually prefer.","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b2e5fd37732575f21e1dbf974c7df7cdcdc263b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":62,"context_line":"        user_id \u003d mapped_properties.get(\u0027name\u0027)"},{"line_number":63,"context_line":"        if user_id is None:"},{"line_number":64,"context_line":"            user_id \u003d self.random_user(identity_provider)"},{"line_number":65,"context_line":"        auth_context[\u0027user_id\u0027] \u003d user_id"},{"line_number":66,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":67,"context_line":"#    def _handle_unscoped_token(self, context, auth_info, auth_context):"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqOM%3D","line":64,"updated":"2014-02-19 23:25:02.000000000","message":"i think raising an unauthorized exception makes sense here","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"54a76371bcfdab62b8281e1069b885f25c053127","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":62,"context_line":"        user_id \u003d mapped_properties.get(\u0027name\u0027)"},{"line_number":63,"context_line":"        if user_id is None:"},{"line_number":64,"context_line":"            user_id \u003d self.random_user(identity_provider)"},{"line_number":65,"context_line":"        auth_context[\u0027user_id\u0027] \u003d user_id"},{"line_number":66,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":67,"context_line":"#    def _handle_unscoped_token(self, context, auth_info, auth_context):"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BrWA%3D","line":64,"in_reply_to":"AAAAUX%2F%2Braw%3D","updated":"2014-02-19 20:50:08.000000000","message":"RuleProcessor doesn\u0027t always issue a username, and I think we agreed that *something* that identifies a user would be required, for instance for auditibility etc.\nI will look at the code tomorrow and try to make it witk with users set to None.","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c6b9f26f9db4d933bde1d38f92778e4f7a1c9aa","unresolved":false,"context_lines":[{"line_number":69,"context_line":"#        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":70,"context_line":"#        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":71,"context_line":"#        auth_context[\u0027group_ids\u0027] \u003d self._refactor_group_ids("},{"line_number":72,"context_line":"#            mapped_properties[\u0027group_ids\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def random_user(self, identity_provider):"},{"line_number":75,"context_line":"        return \u0027@\u0027.join((uuid.uuid4().hex, identity_provider))"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2Brao%3D","line":72,"updated":"2014-02-19 20:42:48.000000000","message":"don\u0027t propose commented out code","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"54a76371bcfdab62b8281e1069b885f25c053127","unresolved":false,"context_lines":[{"line_number":69,"context_line":"#        auth_context[\u0027project_id\u0027] \u003d None"},{"line_number":70,"context_line":"#        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":71,"context_line":"#        auth_context[\u0027group_ids\u0027] \u003d self._refactor_group_ids("},{"line_number":72,"context_line":"#            mapped_properties[\u0027group_ids\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def random_user(self, identity_provider):"},{"line_number":75,"context_line":"        return \u0027@\u0027.join((uuid.uuid4().hex, identity_provider))"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BrY0%3D","line":72,"in_reply_to":"AAAAUX%2F%2Brao%3D","updated":"2014-02-19 20:50:08.000000000","message":"my bad! sorry for that!","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c6b9f26f9db4d933bde1d38f92778e4f7a1c9aa","unresolved":false,"context_lines":[{"line_number":71,"context_line":"#        auth_context[\u0027group_ids\u0027] \u003d self._refactor_group_ids("},{"line_number":72,"context_line":"#            mapped_properties[\u0027group_ids\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def random_user(self, identity_provider):"},{"line_number":75,"context_line":"        return \u0027@\u0027.join((uuid.uuid4().hex, identity_provider))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _get_assertion_params_from_env(self, context):"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BraQ%3D","line":74,"updated":"2014-02-19 20:42:48.000000000","message":"delete this method","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"54a76371bcfdab62b8281e1069b885f25c053127","unresolved":false,"context_lines":[{"line_number":71,"context_line":"#        auth_context[\u0027group_ids\u0027] \u003d self._refactor_group_ids("},{"line_number":72,"context_line":"#            mapped_properties[\u0027group_ids\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def random_user(self, identity_provider):"},{"line_number":75,"context_line":"        return \u0027@\u0027.join((uuid.uuid4().hex, identity_provider))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _get_assertion_params_from_env(self, context):"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BrVw%3D","line":74,"in_reply_to":"AAAAUX%2F%2BraQ%3D","updated":"2014-02-19 20:50:08.000000000","message":"ok.","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    method \u003d \u0027saml2\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUvE%3D","line":34,"updated":"2014-02-23 14:37:20.000000000","message":"Why do you need this when you are requiring it on line 28? Looks like you can just delete the __init__ entirely.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    method \u003d \u0027saml2\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F4U%3D","line":34,"updated":"2014-02-22 18:51:36.000000000","message":"this is already set by doing dependency.requires(\u0027federation_api\u0027) at line 28.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    method \u003d \u0027saml2\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4dg%3D","line":34,"in_reply_to":"AAAAUX%2F%2BUvE%3D","updated":"2014-02-24 18:57:58.000000000","message":"__init__ removed!","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"},{"line_number":38,"context_line":"            self._handle_scoped_token(context, auth_info, auth_context)"},{"line_number":39,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F3I%3D","line":36,"updated":"2014-02-22 18:51:36.000000000","message":"change \"auth_info\" to \"auth_payload\" to match the superclass function signature.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"},{"line_number":38,"context_line":"            self._handle_scoped_token(context, auth_info, auth_context)"},{"line_number":39,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4dQ%3D","line":36,"in_reply_to":"AAAAU3%2F%2F%2F3I%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"},{"line_number":38,"context_line":"            self._handle_scoped_token(context, auth_info, auth_context)"},{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUuY%3D","line":37,"updated":"2014-02-23 14:37:20.000000000","message":"Suggest \"if \u0027id\u0027 in auth\" feels more precise.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.federation_api \u003d federation.Manager()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"},{"line_number":38,"context_line":"            self._handle_scoped_token(context, auth_info, auth_context)"},{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4XM%3D","line":37,"in_reply_to":"AAAAUX%2F%2BUuY%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"},{"line_number":38,"context_line":"            self._handle_scoped_token(context, auth_info, auth_context)"},{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F4E%3D","line":38,"updated":"2014-02-22 18:51:36.000000000","message":"suggest do something like:\n\n auth_context.update(self._handle_scoped_token(auth_info))\n\nthen don\u0027t have to pass auth_context around.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        if auth_info.get(\u0027id\u0027) is not None:"},{"line_number":38,"context_line":"            self._handle_scoped_token(context, auth_info, auth_context)"},{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F30%3D","line":40,"updated":"2014-02-22 18:51:36.000000000","message":"suggest\n\n auth_context.update(self._handle_unscoped_token(context, auth_info))","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6069a2084d8f3206fa1763c97d1069ad3dc6843b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BR2A%3D","line":42,"updated":"2014-02-22 16:06:08.000000000","message":"so _handle_scoped_token does not have to do all the mapping stuff that _handle_unscoped_token does because that would have already been done before the token was scoped?  Is my logic correct?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F4I%3D","line":42,"updated":"2014-02-22 18:51:36.000000000","message":"this function doesn\u0027t use context so get rid of it.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4XU%3D","line":42,"in_reply_to":"AAAAU3%2F%2F%2F4I%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0JQ%3D","line":42,"in_reply_to":"AAAAUX%2F%2BR2A%3D","updated":"2014-02-24 17:26:34.000000000","message":"Brad, correct. At this point the user the mapping has been done, and the user knows what groups she is a part of, and can check what projects/domains she can list.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        else:"},{"line_number":40,"context_line":"            self._handle_unscoped_token(context, auth_info, auth_context)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _handle_scoped_token(self, context, auth_info, auth_context):"},{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4X0%3D","line":42,"in_reply_to":"AAAAUX%2F%2BR2A%3D","updated":"2014-02-24 18:57:58.000000000","message":"Yes.\nYou initiate federated authn (with methods: [\u0027saml2\u0027]), by hitting good old POST /v3/auth/tokens. In the meantime, Apache module parses SAML assertion and injects parameters into the environment. Since there is no \u0027id\u0027 in the request, self._handle_unscoped_token() will be called. The params are then injected to the RuleProcessor, list of user and Keystone groups are issued and based on that we have a set of roles user can use. We now care only about groups/roles and accessible projects/domains. An unscoped token (with that list of groups is returned to the user). The user can now try to scope the token, and providing his requests are authorized/ not denied he will be granted with brand new, scoped token he can use to play with nova, glance, swift etc.  Of course, before the token is scoped, a user can ask for accessible projects or domains basing on the list of groups. To do so, he must call /v3/OS-FEDERATION/(list_accessible_projects|list_accessible_domains) in order to list projects/domains. Such call must have unscoped token in the HTTP header.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"},{"line_number":46,"context_line":"        auth_context[\u0027federated_token\u0027] \u003d token_ref"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _handle_unscoped_token(self, context, auth_info, auth_context):"},{"line_number":49,"context_line":"        assertion \u003d context[\u0027environment\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F3U%3D","line":46,"updated":"2014-02-22 18:51:36.000000000","message":"the docstring for authenticate doesn\u0027t mention \"federated_token\" as something that can be in auth_context. suggest update the documentation.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        token_ref \u003d self.token_api.get_token(auth_info[\u0027id\u0027])"},{"line_number":44,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":45,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"},{"line_number":46,"context_line":"        auth_context[\u0027federated_token\u0027] \u003d token_ref"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _handle_unscoped_token(self, context, auth_info, auth_context):"},{"line_number":49,"context_line":"        assertion \u003d context[\u0027environment\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F3tE%3D","line":46,"in_reply_to":"AAAAU3%2F%2F%2F3U%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":55,"context_line":"            identity_provider, protocol)"},{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F2w%3D","line":56,"updated":"2014-02-22 18:51:36.000000000","message":"how are you going to loads() a dict? Add a unit test for the case when there\u0027s no \u0027rules\u0027 in mapping.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":55,"context_line":"            identity_provider, protocol)"},{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0FU%3D","line":56,"in_reply_to":"AAAAU3%2F%2F%2F2w%3D","updated":"2014-02-24 17:26:34.000000000","message":"This might have to be done at the sql level.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":55,"context_line":"            identity_provider, protocol)"},{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4Vw%3D","line":56,"in_reply_to":"AAAAU3%2F%2F%2F2w%3D","updated":"2014-02-24 18:57:58.000000000","message":"mapping is a dictionary representing whole mapping entity, whereas \u0027rules\u0027 is a plain string (internally  stored in the \u0027extra\u0027 attribute in the backedn), so it need to be deserialized.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":55,"context_line":"            identity_provider, protocol)"},{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUtI%3D","line":57,"updated":"2014-02-23 14:37:20.000000000","message":"Do we really have a nested dict structure with 2 levels or \u0027rules\u0027 keys?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":55,"context_line":"            identity_provider, protocol)"},{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F10%3D","line":57,"updated":"2014-02-22 18:51:36.000000000","message":"This will attempt to pass None to RuleProcessor if there\u0027s no \u0027rules\u0027 in rules. There are no tests that I can find that show that you can pass None to RuleProcessor. Looks like if None is passed to RuleProcessor then it\u0027s just going to fail when you call process(). This needs to be changed so that it won\u0027t pass None to RuleProcessor.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"},{"line_number":61,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":62,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUsg%3D","line":59,"updated":"2014-02-23 14:37:20.000000000","message":"If `rule_processor.process` will not add a \u0027name\u0027 key with a value of `None` then \"if \u0027name\u0027 not in mapped_properties\" feels better.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"},{"line_number":61,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":62,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F1Y%3D","line":59,"updated":"2014-02-22 18:51:36.000000000","message":"shouldn\u0027t the process() method be protecting callers from have to check this? the docstring says it returns a dict with a \u0027name\u0027 and \u0027group_ids\u0027.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"},{"line_number":61,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":62,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":63,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUtU%3D","line":60,"updated":"2014-02-23 14:37:20.000000000","message":"Is this too big for one line?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":58,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":59,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"},{"line_number":61,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":62,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":63,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F4Uk%3D","line":60,"in_reply_to":"AAAAUX%2F%2BUtU%3D","updated":"2014-02-24 18:57:58.000000000","message":"not at all! :-)","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"},{"line_number":61,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":62,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":63,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":64,"context_line":"        auth_context[\u0027identity_provider\u0027] \u003d identity_provider"},{"line_number":65,"context_line":"        auth_context[\u0027protocol\u0027] \u003d protocol"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F3A%3D","line":63,"updated":"2014-02-22 18:51:36.000000000","message":"the docstring for authenticate doesn\u0027t mention \"group_ids\", \"identity_provider\", or \"protocol\" as things that can be in auth_context. suggest update the documentation, or put these in \"extras\".","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            msg \u003d _(\"Could not map assertion\")"},{"line_number":61,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":62,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":63,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":64,"context_line":"        auth_context[\u0027identity_provider\u0027] \u003d identity_provider"},{"line_number":65,"context_line":"        auth_context[\u0027protocol\u0027] \u003d protocol"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0DA%3D","line":63,"in_reply_to":"AAAAU3%2F%2F%2F3A%3D","updated":"2014-02-24 17:26:34.000000000","message":"extras seems like a good spot","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        auth_context[\u0027protocol\u0027] \u003d protocol"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _validate_expiration(self, token_ref):"},{"line_number":68,"context_line":"        expires_at \u003d token_ref[\u0027expires\u0027]"},{"line_number":69,"context_line":"        if expires_at and timeutils.utcnow() \u003e expires_at:"},{"line_number":70,"context_line":"            raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BUrA%3D","line":68,"updated":"2014-02-23 14:37:20.000000000","message":"I assume `token_ref[\u0027expires\u0027]` can be empty or `None`. Is that correct?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _validate_expiration(self, token_ref):"},{"line_number":68,"context_line":"        expires_at \u003d token_ref[\u0027expires\u0027]"},{"line_number":69,"context_line":"        if expires_at and timeutils.utcnow() \u003e expires_at:"},{"line_number":70,"context_line":"            raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F20%3D","line":69,"updated":"2014-02-22 18:51:36.000000000","message":"how would expires_at be falsy?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _validate_expiration(self, token_ref):"},{"line_number":68,"context_line":"        expires_at \u003d token_ref[\u0027expires\u0027]"},{"line_number":69,"context_line":"        if expires_at and timeutils.utcnow() \u003e expires_at:"},{"line_number":70,"context_line":"            raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F3ys%3D","line":69,"in_reply_to":"AAAAU3%2F%2F%2F20%3D","updated":"2014-02-24 18:57:58.000000000","message":"You are right. I did take a look in  token/backends/sql.create_token() and expires will always be set to a certain date.\nChanged to: \n\n    def _validate_expiration(self, token_ref):\n        expires_at \u003d token_ref[\u0027expires\u0027]\n        if timeutils.utcnow() \u003e expires_at:                                                    \n            raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"63ae9d0d74cd31e665f25ef3f104624688c5694c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        token_ref \u003d self.token_api.get_token(auth_payload[\u0027id\u0027])"},{"line_number":40,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":41,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"},{"line_number":42,"context_line":"        auth_context[\u0027federated_token\u0027] \u003d token_ref"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _handle_unscoped_token(self, context, auth_payload, auth_context):"},{"line_number":45,"context_line":"        assertion \u003d context[\u0027environment\u0027]"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAU3%2F%2Fwfo%3D","line":42,"updated":"2014-02-24 22:52:37.000000000","message":"why are federated tokens special such that they should appear in context? ... especially with their own key?","commit_id":"730d7ebe219f0d82e35ff4124eb8e1f9594cd038"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"88ab0c77bd8e2ef09c6a60ddef347f6a54d49903","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        token_ref \u003d self.token_api.get_token(auth_payload[\u0027id\u0027])"},{"line_number":40,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":41,"context_line":"        auth_context[\u0027user_id\u0027] \u003d token_ref[\u0027user_id\u0027]"},{"line_number":42,"context_line":"        auth_context[\u0027federated_token\u0027] \u003d token_ref"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _handle_unscoped_token(self, context, auth_payload, auth_context):"},{"line_number":45,"context_line":"        assertion \u003d context[\u0027environment\u0027]"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAU3%2F%2FwZc%3D","line":42,"in_reply_to":"AAAAU3%2F%2Fwfo%3D","updated":"2014-02-25 00:12:45.000000000","message":"it was for scoping the tokens, where some objects (like \u0027user\u0027) are being reused.  \nDo you suggest removeing it and explicitely puting objects to be reused in the auth_context?","commit_id":"730d7ebe219f0d82e35ff4124eb8e1f9594cd038"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"63ae9d0d74cd31e665f25ef3f104624688c5694c","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":55,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":56,"context_line":"            raise exception.Unauthorized(_(\"Could not map assertion\"))"},{"line_number":57,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":58,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":59,"context_line":"        auth_context[\u0027identity_provider\u0027] \u003d identity_provider"},{"line_number":60,"context_line":"        auth_context[\u0027protocol\u0027] \u003d protocol"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAU3%2F%2Fwgw%3D","line":57,"updated":"2014-02-24 22:52:37.000000000","message":"user ID\u0027s should be url-safe:\n\n  auth_context[\u0027user_id\u0027] \u003d urllib.quote(mapped_properties[\u0027name\u0027])","commit_id":"730d7ebe219f0d82e35ff4124eb8e1f9594cd038"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"88ab0c77bd8e2ef09c6a60ddef347f6a54d49903","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":55,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":56,"context_line":"            raise exception.Unauthorized(_(\"Could not map assertion\"))"},{"line_number":57,"context_line":"        auth_context[\u0027user_id\u0027] \u003d mapped_properties[\u0027name\u0027]"},{"line_number":58,"context_line":"        auth_context[\u0027group_ids\u0027] \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":59,"context_line":"        auth_context[\u0027identity_provider\u0027] \u003d identity_provider"},{"line_number":60,"context_line":"        auth_context[\u0027protocol\u0027] \u003d protocol"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAU3%2F%2Fwaw%3D","line":57,"in_reply_to":"AAAAU3%2F%2Fwgw%3D","updated":"2014-02-25 00:12:45.000000000","message":"...or according to dstanek\u0027s suggestion quote it with use of six packet, so we are Python3 compatible? Again, Patchset 37.","commit_id":"730d7ebe219f0d82e35ff4124eb8e1f9594cd038"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":54,"context_line":"            identity_provider, protocol)"},{"line_number":55,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":56,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":57,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":58,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv3w%3D","line":55,"updated":"2014-02-25 00:44:41.000000000","message":"shouldn\u0027t call jsonutils.loads on a dict (if there\u0027s no \u0027rules\u0027 in mapping).","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":54,"context_line":"            identity_provider, protocol)"},{"line_number":55,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":56,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":57,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":58,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuTc%3D","line":55,"in_reply_to":"AAAAU3%2F%2Fv3w%3D","updated":"2014-02-25 03:54:24.000000000","message":"changing this to just mapping[\u0027rules\u0027], since the json schema is pretty strict about what rules should look like.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":54,"context_line":"            identity_provider, protocol)"},{"line_number":55,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":56,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":57,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":58,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":59,"context_line":"            raise exception.Unauthorized(_(\"Could not map assertion\"))"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv3Q%3D","line":56,"updated":"2014-02-25 00:44:41.000000000","message":"This will attempt to pass None to RuleProcessor if there\u0027s no \u0027rules\u0027 in rules. There are no tests that I can find that show that you can pass None to RuleProcessor. Looks like if None is passed to RuleProcessor then it\u0027s just going to fail when you call process(). This needs to be changed so that it won\u0027t pass None to RuleProcessor.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":54,"context_line":"            identity_provider, protocol)"},{"line_number":55,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":56,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":57,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":58,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":59,"context_line":"            raise exception.Unauthorized(_(\"Could not map assertion\"))"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuTM%3D","line":56,"in_reply_to":"AAAAU3%2F%2Fv3Q%3D","updated":"2014-02-25 03:54:24.000000000","message":"brant, the json schema validator would fail if a mapping entity had no rules. so a test calling the ruleprocessor with no rules seems unnecessary, let me know if you still want one added in.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":56,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":57,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":58,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":59,"context_line":"            raise exception.Unauthorized(_(\"Could not map assertion\"))"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvr8%3D","line":58,"updated":"2014-02-25 00:44:41.000000000","message":"rule_processor.process should be verifying that it could map the assertion so that callers don\u0027t have to.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        rules \u003d jsonutils.loads(mapping.get(\u0027rules\u0027, {}))"},{"line_number":56,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules.get(\u0027rules\u0027))"},{"line_number":57,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":58,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":59,"context_line":"            raise exception.Unauthorized(_(\"Could not map assertion\"))"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FuV4%3D","line":58,"in_reply_to":"AAAAU3%2F%2Fvr8%3D","updated":"2014-02-25 03:54:24.000000000","message":"moved this to process","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"04fb355816b4037934587cce7ce5fc7db6700807","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def _handle_scoped_token(self, auth_payload):"},{"line_number":57,"context_line":"        token_ref \u003d self.token_api.get_token(auth_payload[\u0027id\u0027])"},{"line_number":58,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":59,"context_line":"        return {"},{"line_number":60,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":61,"context_line":"            \u0027federated_token\u0027: token_ref"},{"line_number":62,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAU3%2F%2FmHI%3D","line":59,"updated":"2014-02-25 18:47:26.000000000","message":"I think there is still a concern here about including the token in the auth_context","commit_id":"1abaf1603971a8cbc07f96c5e30cfbeb828f12f2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a0c7b7a723de318808b6067b5bc56e0d0d72c643","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self._validate_expiration(token_ref)"},{"line_number":59,"context_line":"        return {"},{"line_number":60,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":61,"context_line":"            \u0027federated_token\u0027: token_ref"},{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _handle_unscoped_token(self, context, auth_payload):"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAU3%2F%2Flt0%3D","line":61,"updated":"2014-02-25 19:21:58.000000000","message":"it looks like all token provider is doing is getting things back out of this ref -- so don\u0027t pass a special \u0027federated_token\u0027 thing through context, and just pass the relevant context itself","commit_id":"1abaf1603971a8cbc07f96c5e30cfbeb828f12f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"04fb355816b4037934587cce7ce5fc7db6700807","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules)"},{"line_number":74,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        return {"},{"line_number":77,"context_line":"            \u0027user_id\u0027: parse.quote(mapped_properties[\u0027name\u0027]),"},{"line_number":78,"context_line":"            \u0027group_ids\u0027: mapped_properties[\u0027group_ids\u0027],"},{"line_number":79,"context_line":"            \u0027identity_provider\u0027: identity_provider,"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAU3%2F%2FmHc%3D","line":76,"updated":"2014-02-25 18:47:26.000000000","message":"it might be best to dump most of this info into extras:\n\n  auth_context[\u0027user_id\u0027] \u003dparse.quote(mapped_properties[\u0027name\u0027])\n  auth_context[\u0027extras\u0027][\u0027federation\u0027] \u003d {\n       \u0027user_name\u0027: mapped_properties[\u0027name\u0027],\n       \u0027group_ids\u0027: mapped_properties[\u0027group_ids\u0027],\n       \u0027identity_provider\u0027: identity_provider,\n       \u0027protocol\u0027: protocol\n    }\n\nat which point, id pass in auth_context instead of calling .update (line 53)","commit_id":"1abaf1603971a8cbc07f96c5e30cfbeb828f12f2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a0c7b7a723de318808b6067b5bc56e0d0d72c643","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        rule_processor \u003d utils.RuleProcessor(rules)"},{"line_number":74,"context_line":"        mapped_properties \u003d rule_processor.process(assertion)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        return {"},{"line_number":77,"context_line":"            \u0027user_id\u0027: parse.quote(mapped_properties[\u0027name\u0027]),"},{"line_number":78,"context_line":"            \u0027group_ids\u0027: mapped_properties[\u0027group_ids\u0027],"},{"line_number":79,"context_line":"            \u0027identity_provider\u0027: identity_provider,"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAAU3%2F%2Fluc%3D","line":76,"in_reply_to":"AAAAU3%2F%2FmHc%3D","updated":"2014-02-25 19:21:58.000000000","message":"don\u0027t use \"extras\" anywhere for anything ever please make it die","commit_id":"1abaf1603971a8cbc07f96c5e30cfbeb828f12f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bc7d4bb85abb9369a6ce7dea875f3ddba5a83821","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        if \u0027id\u0027 in auth_payload:"},{"line_number":51,"context_line":"            self._handle_scoped_token(auth_context, auth_payload)"},{"line_number":52,"context_line":"        else:"},{"line_number":53,"context_line":"            self._handle_unscoped_token(context, auth_context, auth_payload)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAU3%2F%2FlGY%3D","line":51,"updated":"2014-02-25 20:39:27.000000000","message":"i can probably go back to .update() calls like brant mentioned, if we stick to a flat auth_context","commit_id":"9f17c8955fec7d1c146d05e9f4cee206f28f9377"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Authenticate federated user and return an authentication context."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":38,"context_line":"        :auth_payload: the content of the authentication for a given method"},{"line_number":39,"context_line":"        :auth_context: user authentication context, a dictionary shared"},{"line_number":40,"context_line":"                       by all plugins."},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FHM%3D","line":38,"updated":"2014-02-27 00:59:19.000000000","message":"add param -\u003e \"param auth_payload\"","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Authenticate federated user and return an authentication context."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":38,"context_line":"        :auth_payload: the content of the authentication for a given method"},{"line_number":39,"context_line":"        :auth_context: user authentication context, a dictionary shared"},{"line_number":40,"context_line":"                       by all plugins."},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7iA%3D","line":38,"in_reply_to":"AAAAVX%2F%2F%2FHM%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":38,"context_line":"        :auth_payload: the content of the authentication for a given method"},{"line_number":39,"context_line":"        :auth_context: user authentication context, a dictionary shared"},{"line_number":40,"context_line":"                       by all plugins."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        In addition to ``user_id`` in ``auth_context``, the ``saml2`` plugin"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FHE%3D","line":39,"updated":"2014-02-27 00:59:19.000000000","message":"add param \u003d\u003e \"param auth_context\"","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":38,"context_line":"        :auth_payload: the content of the authentication for a given method"},{"line_number":39,"context_line":"        :auth_context: user authentication context, a dictionary shared"},{"line_number":40,"context_line":"                       by all plugins."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        In addition to ``user_id`` in ``auth_context``, the ``saml2`` plugin"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7h8%3D","line":39,"in_reply_to":"AAAAVX%2F%2F%2FHE%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            auth_context.update(self._handle_scoped_token(auth_payload))"},{"line_number":52,"context_line":"        else:"},{"line_number":53,"context_line":"            auth_context.update(self._handle_unscoped_token(context,"},{"line_number":54,"context_line":"                                                            auth_payload))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _handle_scoped_token(self, auth_payload):"},{"line_number":57,"context_line":"        token_ref \u003d self.token_api.get_token(auth_payload[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FF0%3D","line":54,"updated":"2014-02-27 00:59:19.000000000","message":"could remove some duplication here --\n\n if \u0027id\u0027 in auth_payload:\n     fields \u003d self._handle_scoped_token(auth_payload)\n else:\n    fields \u003d self._handle_unscoped_token(context, auth_payload)\n\n auth_context.update(fields)","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            auth_context.update(self._handle_scoped_token(auth_payload))"},{"line_number":52,"context_line":"        else:"},{"line_number":53,"context_line":"            auth_context.update(self._handle_unscoped_token(context,"},{"line_number":54,"context_line":"                                                            auth_payload))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _handle_scoped_token(self, auth_payload):"},{"line_number":57,"context_line":"        token_ref \u003d self.token_api.get_token(auth_payload[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7b4%3D","line":54,"in_reply_to":"AAAAVX%2F%2F%2FF0%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        groups \u003d token_ref[\u0027user\u0027][\u0027OS-FEDERATION:groups\u0027]"},{"line_number":60,"context_line":"        return {"},{"line_number":61,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":62,"context_line":"            \u0027group_ids\u0027: [x[\u0027id\u0027] for x in groups]"},{"line_number":63,"context_line":"        }"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _handle_unscoped_token(self, context, auth_payload):"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FE0%3D","line":62,"updated":"2014-02-27 00:59:19.000000000","message":"suggest change x to group","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        groups \u003d token_ref[\u0027user\u0027][\u0027OS-FEDERATION:groups\u0027]"},{"line_number":60,"context_line":"        return {"},{"line_number":61,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":62,"context_line":"            \u0027group_ids\u0027: [x[\u0027id\u0027] for x in groups]"},{"line_number":63,"context_line":"        }"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _handle_unscoped_token(self, context, auth_payload):"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7ck%3D","line":62,"in_reply_to":"AAAAVX%2F%2F%2FE0%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1e1aadffc4202f9bb5521f18bddb9733a8a1ab6e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        :param auth_context: user authentication context, a dictionary"},{"line_number":42,"context_line":"                             shared by all plugins."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        In addition to ``user_id`` in ``auth_context``, the ``saml2`` plugin"},{"line_number":45,"context_line":"        also sets ``group_ids``, ``identity_provider`` and ``protocol``."},{"line_number":46,"context_line":"        These values are required for issuing an unscoped federated token."},{"line_number":47,"context_line":"        When scoping the federated tokens, the plugin sets"}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAVX%2F%2FvHs%3D","line":44,"updated":"2014-02-28 17:24:35.000000000","message":"I think this documentation is a little out of date. identiity_provider and protocol are not alway set. There is also mention of federated_token and I don\u0027t see that in this file at all.","commit_id":"986c3eb08aa019a5793074fd7bade83972135271"}],"keystone/auth/routers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8995e7cdd323535830f98f319780f40c9a212549","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    # For federation extension"},{"line_number":43,"context_line":"    mapper.connect(\u0027/auth/tokens/identity_provider/{idp}/protocol/{protocol}\u0027,"},{"line_number":44,"context_line":"                   controller\u003dauth_controller,"},{"line_number":45,"context_line":"                   action\u003d\u0027authenticate_unscoped_federation\u0027,"},{"line_number":46,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FInY%3D","line":43,"updated":"2014-02-16 14:31:53.000000000","message":"this isn\u0027t in the API spec? I assume it\u0027s supposed to be namespaced by the extension somehow, but it\u0027s not (this looks like a core API resource)","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8995e7cdd323535830f98f319780f40c9a212549","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    mapper.connect(\u0027/auth/tokens/identity_provider/{idp}/protocol/{protocol}\u0027,"},{"line_number":44,"context_line":"                   controller\u003dauth_controller,"},{"line_number":45,"context_line":"                   action\u003d\u0027authenticate_unscoped_federation\u0027,"},{"line_number":46,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FInQ%3D","line":46,"updated":"2014-02-16 14:31:53.000000000","message":"i\u0027m also surprised that this isn\u0027t a POST - is there some background / reasoning to that?","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e7cf2ab684e147bbb3c936b158b4eb18e24df4dc","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    mapper.connect(\u0027/auth/tokens/identity_provider/{idp}/protocol/{protocol}\u0027,"},{"line_number":44,"context_line":"                   controller\u003dauth_controller,"},{"line_number":45,"context_line":"                   action\u003d\u0027authenticate_unscoped_federation\u0027,"},{"line_number":46,"context_line":"                   conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIms%3D","line":46,"in_reply_to":"AAAAUX%2F%2FInQ%3D","updated":"2014-02-16 14:36:46.000000000","message":"In the webSSO browser is redirected from the IdP to the SP and I think it was not clear if the original HTTP method would stay the same (it wasn\u0027t in my simple tests where I was sending some data from HTML forms to the SAML protected resource, being redirected to IdP, authn myself, and going again to the SP. I ended up with a HTTP GET). This may be not the case for the SAML ECP/similar extensions but it\u0027s hard to say that now...:/","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"}],"keystone/common/authorization.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"aaae1eea1b9461ff0f527843c3ab1d92578ac457","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* ``domain_id`` (optional): domain ID of the scoped domain if auth is"},{"line_number":35,"context_line":"                            domain-scoped"},{"line_number":36,"context_line":"* ``roles`` (optional): list of role names for the given scope"},{"line_number":37,"context_line":"* ``group_ids``: list of group IDs for which the API user has membership"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BS%2BE%3D","line":37,"updated":"2014-02-22 04:33:14.000000000","message":"the description sounds weird, especially the API part, not sure how to fix it up though","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6069a2084d8f3206fa1763c97d1069ad3dc6843b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* ``domain_id`` (optional): domain ID of the scoped domain if auth is"},{"line_number":35,"context_line":"                            domain-scoped"},{"line_number":36,"context_line":"* ``roles`` (optional): list of role names for the given scope"},{"line_number":37,"context_line":"* ``group_ids``: list of group IDs for which the API user has membership"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BR1s%3D","line":37,"in_reply_to":"AAAAUX%2F%2BS%2BE%3D","updated":"2014-02-22 16:06:08.000000000","message":"Why can\u0027t you just say Auth context user?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    creds \u003d {}"},{"line_number":69,"context_line":"    token_data \u003d token[\u0027token\u0027]"},{"line_number":70,"context_line":"    try:"},{"line_number":71,"context_line":"        user \u003d token_data[\u0027user\u0027]"},{"line_number":72,"context_line":"        creds[\u0027user_id\u0027] \u003d user[\u0027id\u0027]"},{"line_number":73,"context_line":"    except AttributeError:"},{"line_number":74,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid user data in v3 token\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F9SQ%3D","line":71,"updated":"2014-02-23 14:37:20.000000000","message":"Any reason for this change?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    creds \u003d {}"},{"line_number":69,"context_line":"    token_data \u003d token[\u0027token\u0027]"},{"line_number":70,"context_line":"    try:"},{"line_number":71,"context_line":"        user \u003d token_data[\u0027user\u0027]"},{"line_number":72,"context_line":"        creds[\u0027user_id\u0027] \u003d user[\u0027id\u0027]"},{"line_number":73,"context_line":"    except AttributeError:"},{"line_number":74,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid user data in v3 token\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F3qI%3D","line":71,"in_reply_to":"AAAAU3%2F%2F9SQ%3D","updated":"2014-02-24 18:57:58.000000000","message":"i think just readability, however reverted to token_data[\u0027user\u0027]","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    creds \u003d {}"},{"line_number":69,"context_line":"    token_data \u003d token[\u0027token\u0027]"},{"line_number":70,"context_line":"    try:"},{"line_number":71,"context_line":"        user \u003d token_data[\u0027user\u0027]"},{"line_number":72,"context_line":"        creds[\u0027user_id\u0027] \u003d user[\u0027id\u0027]"},{"line_number":73,"context_line":"    except AttributeError:"},{"line_number":74,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid user data in v3 token\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0Bo%3D","line":71,"in_reply_to":"AAAAU3%2F%2F9SQ%3D","updated":"2014-02-24 17:26:34.000000000","message":"just to make line 87 a bit cleaner, but I could change it back.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        for role in token_data[\u0027roles\u0027]:"},{"line_number":85,"context_line":"            creds[\u0027roles\u0027].append(role[\u0027name\u0027])"},{"line_number":86,"context_line":"    creds[\u0027group_ids\u0027] \u003d ["},{"line_number":87,"context_line":"        g[\u0027id\u0027] for g in user.get(\u0027OS-FEDERATION:groups\u0027, [])]"},{"line_number":88,"context_line":"    return creds"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2F0M%3D","line":87,"updated":"2014-02-22 18:51:36.000000000","message":"suggest don\u0027t add \u0027group_ids\u0027 if there\u0027s no \u0027OS-FEDERATION:groups\u0027 rather than have an empty list. Then it will be more like domain and roles.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        for role in token_data[\u0027roles\u0027]:"},{"line_number":85,"context_line":"            creds[\u0027roles\u0027].append(role[\u0027name\u0027])"},{"line_number":86,"context_line":"    creds[\u0027group_ids\u0027] \u003d ["},{"line_number":87,"context_line":"        g[\u0027id\u0027] for g in user.get(\u0027OS-FEDERATION:groups\u0027, [])]"},{"line_number":88,"context_line":"    return creds"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F3pg%3D","line":87,"in_reply_to":"AAAAU3%2F%2F%2F0M%3D","updated":"2014-02-24 18:57:58.000000000","message":"Is it worth doing this and later adding extra conditions in https://review.openstack.org/#/c/71353/34/keystone/contrib/federation/controllers.py lines 311, 334?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* ``domain_id`` (optional): domain ID of the scoped domain if auth is"},{"line_number":35,"context_line":"                            domain-scoped"},{"line_number":36,"context_line":"* ``roles`` (optional): list of role names for the given scope"},{"line_number":37,"context_line":"* ``group_ids``: list of group IDs for which the API user has membership"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FEA%3D","line":37,"updated":"2014-02-27 00:59:19.000000000","message":"this needs to say something about federation, because users can obviously be in groups that aren\u0027t listed here when not federated. Probably should be called federated_group_ids or something.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3940b190130b39b02a33bfde5371c5c0371158d2","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* ``domain_id`` (optional): domain ID of the scoped domain if auth is"},{"line_number":35,"context_line":"                            domain-scoped"},{"line_number":36,"context_line":"* ``roles`` (optional): list of role names for the given scope"},{"line_number":37,"context_line":"* ``group_ids``: list of group IDs for which the API user has membership"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAVX%2F%2F5bM%3D","line":37,"updated":"2014-02-27 14:36:28.000000000","message":"this needs to say something about federation, because users can obviously be in groups that aren\u0027t listed here when not federated. Probably should be called federated_group_ids or something.","commit_id":"986c3eb08aa019a5793074fd7bade83972135271"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7d2100396aacf3925312c11673429ff8f0d173d1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* ``domain_id`` (optional): domain ID of the scoped domain if auth is"},{"line_number":35,"context_line":"                            domain-scoped"},{"line_number":36,"context_line":"* ``roles`` (optional): list of role names for the given scope"},{"line_number":37,"context_line":"* ``group_ids``: list of group IDs for which the API user has membership"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"AAAAVX%2F%2F5RQ%3D","line":37,"in_reply_to":"AAAAVX%2F%2F5bM%3D","updated":"2014-02-27 14:54:26.000000000","message":"i\u0027d really rather this one attribute *not* be tied to federation, as it\u0027s for internal use only and it would be completely viable for this to be utilized in more core at some point (for example, including group IDs in the token was originally proposed as a solution to make token revocation more robust, not for federation)","commit_id":"986c3eb08aa019a5793074fd7bade83972135271"}],"keystone/common/config.py":[{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"eac4f1f29c58c24e535ff7cd6ff711e75eb6917a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":145,"context_line":"                   default\u003d\u0027keystone.contrib.federation.\u0027"},{"line_number":146,"context_line":"                           \u0027backends.sql.Federation\u0027),"},{"line_number":147,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027,"},{"line_number":148,"context_line":"                   default\u003d\u0027FEDERATION_\u0027)],"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9hf4%3D","line":147,"updated":"2014-02-06 10:27:16.000000000","message":"You should add this to etc/keystone.conf.sample","commit_id":"6a715f79330bd82326e7a0ceaf4e77dc8b52cc47"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dec748d2aeb9457d067ec51b1719dd32991ae1f5","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":145,"context_line":"                   default\u003d\u0027keystone.contrib.federation.\u0027"},{"line_number":146,"context_line":"                           \u0027backends.sql.Federation\u0027),"},{"line_number":147,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027,"},{"line_number":148,"context_line":"                   default\u003d\u0027FEDERATION_\u0027)],"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9hMo%3D","line":147,"in_reply_to":"AAAAUH%2F9hf4%3D","updated":"2014-02-06 10:58:48.000000000","message":"you are right!","commit_id":"6a715f79330bd82326e7a0ceaf4e77dc8b52cc47"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a9a8e497e5a166fa5146f1b2b4b005117f6c849c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                   default\u003d\u0027keystone.contrib.federation.\u0027"},{"line_number":156,"context_line":"                           \u0027backends.sql.Federation\u0027),"},{"line_number":157,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027,"},{"line_number":158,"context_line":"                   default\u003d\u0027FEDERATION_\u0027)],"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    \u0027policy\u0027: ["},{"line_number":161,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FxsI%3D","line":158,"updated":"2014-02-10 21:54:45.000000000","message":"this is almost certainly wrong.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"abbe65555df192d765a5f906b2b8aff701f6f341","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from oslo.config import cfg"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_DEFAULT_AUTH_METHODS \u003d [\u0027federation\u0027, \u0027external\u0027, \u0027password\u0027, \u0027token\u0027]"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"FILE_OPTIONS \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FUK4%3D","line":18,"updated":"2014-02-14 01:33:34.000000000","message":"you don\u0027t need this here, we probably don\u0027t want it enabled by default at this point.","commit_id":"be4a8d74c666b6aa6ed05cc6cc4af1c9b0be9907"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"12fb77a5b3585e7cd87e546f2cb3f1d523617356","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from oslo.config import cfg"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_DEFAULT_AUTH_METHODS \u003d [\u0027federation\u0027, \u0027external\u0027, \u0027password\u0027, \u0027token\u0027]"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"FILE_OPTIONS \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FR1c%3D","line":18,"in_reply_to":"AAAAUX%2F%2FUK4%3D","updated":"2014-02-14 09:49:55.000000000","message":"Done","commit_id":"be4a8d74c666b6aa6ed05cc6cc4af1c9b0be9907"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"abbe65555df192d765a5f906b2b8aff701f6f341","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        #deals with REMOTE_USER authentication"},{"line_number":270,"context_line":"        cfg.StrOpt(\u0027external\u0027,"},{"line_number":271,"context_line":"                   default\u003d\u0027keystone.auth.plugins.external.DefaultDomain\u0027),"},{"line_number":272,"context_line":"        cfg.StrOpt(\u0027federation\u0027,"},{"line_number":273,"context_line":"                   default\u003d\u0027keystone.auth.plugins.federation.Federation\u0027)],"},{"line_number":274,"context_line":"    \u0027paste_deploy\u0027: ["},{"line_number":275,"context_line":"        cfg.StrOpt(\u0027config_file\u0027, default\u003dNone)],"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FUKs%3D","line":272,"updated":"2014-02-14 01:33:34.000000000","message":"you don\u0027t need this here, we probably don\u0027t want it enabled by default at this point.","commit_id":"be4a8d74c666b6aa6ed05cc6cc4af1c9b0be9907"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"12fb77a5b3585e7cd87e546f2cb3f1d523617356","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        #deals with REMOTE_USER authentication"},{"line_number":270,"context_line":"        cfg.StrOpt(\u0027external\u0027,"},{"line_number":271,"context_line":"                   default\u003d\u0027keystone.auth.plugins.external.DefaultDomain\u0027),"},{"line_number":272,"context_line":"        cfg.StrOpt(\u0027federation\u0027,"},{"line_number":273,"context_line":"                   default\u003d\u0027keystone.auth.plugins.federation.Federation\u0027)],"},{"line_number":274,"context_line":"    \u0027paste_deploy\u0027: ["},{"line_number":275,"context_line":"        cfg.StrOpt(\u0027config_file\u0027, default\u003dNone)],"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FR1Y%3D","line":272,"in_reply_to":"AAAAUX%2F%2FUKs%3D","updated":"2014-02-14 09:49:55.000000000","message":"Done","commit_id":"be4a8d74c666b6aa6ed05cc6cc4af1c9b0be9907"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"aaae1eea1b9461ff0f527843c3ab1d92578ac457","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                   default\u003d\u0027keystone.contrib.federation.\u0027"},{"line_number":329,"context_line":"                           \u0027backends.sql.Federation\u0027,"},{"line_number":330,"context_line":"                   help\u003d\u0027Keystone Federation backend driver\u0027)],"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    \u0027policy\u0027: ["},{"line_number":333,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":334,"context_line":"                   default\u003d\u0027keystone.policy.backends.sql.Policy\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BXRU%3D","side":"PARENT","line":331,"updated":"2014-02-22 04:33:14.000000000","message":"add the white space back?","commit_id":"5adef5de8f8c513b6224e9f8d0a609d0a537e01e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                   default\u003d\u0027keystone.contrib.federation.\u0027"},{"line_number":329,"context_line":"                           \u0027backends.sql.Federation\u0027,"},{"line_number":330,"context_line":"                   help\u003d\u0027Keystone Federation backend driver\u0027)],"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    \u0027policy\u0027: ["},{"line_number":333,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":334,"context_line":"                   default\u003d\u0027keystone.policy.backends.sql.Policy\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F3o4%3D","side":"PARENT","line":331,"in_reply_to":"AAAAUX%2F%2BXRU%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"5adef5de8f8c513b6224e9f8d0a609d0a537e01e"}],"keystone/common/sql/core.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6069a2084d8f3206fa1763c97d1069ad3dc6843b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# Suppress flake8\u0027s unused import warning for flag_modified:"},{"line_number":60,"context_line":"flag_modified \u003d flag_modified"},{"line_number":61,"context_line":"and_ \u003d sql.and_"},{"line_number":62,"context_line":"or_ \u003d sql.or_"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def initialize():"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BR1k%3D","line":62,"updated":"2014-02-22 16:06:08.000000000","message":"I was searching for this when I saw or_ in the code.   Very glad I found it. It was bugging me... Just curiously, is it really worth the 4 chars you are saving to make the code more difficult to read????","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# Suppress flake8\u0027s unused import warning for flag_modified:"},{"line_number":60,"context_line":"flag_modified \u003d flag_modified"},{"line_number":61,"context_line":"and_ \u003d sql.and_"},{"line_number":62,"context_line":"or_ \u003d sql.or_"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def initialize():"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fzdk%3D","line":62,"in_reply_to":"AAAAU3%2F%2Fz7s%3D","updated":"2014-02-24 18:57:58.000000000","message":"++","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# Suppress flake8\u0027s unused import warning for flag_modified:"},{"line_number":60,"context_line":"flag_modified \u003d flag_modified"},{"line_number":61,"context_line":"and_ \u003d sql.and_"},{"line_number":62,"context_line":"or_ \u003d sql.or_"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def initialize():"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fz7s%3D","line":62,"in_reply_to":"AAAAUX%2F%2BR1k%3D","updated":"2014-02-24 17:26:34.000000000","message":"i think the goal is to keep all the sqlalchemy stuff in here.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bc7d4bb85abb9369a6ce7dea875f3ddba5a83821","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# Suppress flake8\u0027s unused import warning for flag_modified:"},{"line_number":60,"context_line":"flag_modified \u003d flag_modified"},{"line_number":61,"context_line":"and_ \u003d sql.and_"},{"line_number":62,"context_line":"or_ \u003d sql.or_"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def initialize():"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAU3%2F%2FlFc%3D","line":62,"updated":"2014-02-25 20:39:27.000000000","message":"this can be removed","commit_id":"9f17c8955fec7d1c146d05e9f4cee206f28f9377"}],"keystone/contrib/federation/backends/sql.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        return mapping_ref.to_dict()"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    # SAML consuming helpful methods"},{"line_number":256,"context_line":"    def get_mapping_from_idp_proto(self, idp_id, proto_id):"},{"line_number":257,"context_line":"        session \u003d db_session.get_session()"},{"line_number":258,"context_line":"        with session.begin():"},{"line_number":259,"context_line":"            protocol_ref \u003d self._get_protocol(idp_id, proto_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lCM%3D","line":256,"updated":"2014-02-05 22:23:56.000000000","message":"nit: get_mapping_from_idp_and_protocol\n\notherwise ++, nice reuse","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        return mapping_ref.to_dict()"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    # SAML consuming helpful methods"},{"line_number":256,"context_line":"    def get_mapping_from_idp_proto(self, idp_id, proto_id):"},{"line_number":257,"context_line":"        session \u003d db_session.get_session()"},{"line_number":258,"context_line":"        with session.begin():"},{"line_number":259,"context_line":"            protocol_ref \u003d self._get_protocol(idp_id, proto_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iM0%3D","line":256,"in_reply_to":"AAAAUH%2F9lCM%3D","updated":"2014-02-06 09:46:05.000000000","message":"I didn\u0027t want to make the method name too long.\nWill be fixed in next patchset.","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0158582e0929d35706253c957d8769ad2c1f6216","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        return mapping_ref.to_dict()"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    # SAML consuming helpful methods"},{"line_number":248,"context_line":"    def get_mapping_from_idp_and_proto(self, idp_id, proto_id):"},{"line_number":249,"context_line":"        session \u003d db_session.get_session()"},{"line_number":250,"context_line":"        with session.begin():"},{"line_number":251,"context_line":"            protocol_ref \u003d self._get_protocol(idp_id, proto_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJuI%3D","line":248,"updated":"2014-02-15 23:12:13.000000000","message":"put the L back into protocol -- zero need to abbreviate it, it just makes the code harder to read for newcomers","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                setattr(mapping_ref, attr, getattr(new_mapping, attr))"},{"line_number":248,"context_line":"        return mapping_ref.to_dict()"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def get_mapping_from_idp_and_protocol(self, idp_id, protocol_id):"},{"line_number":251,"context_line":"        session \u003d db_session.get_session()"},{"line_number":252,"context_line":"        with session.begin():"},{"line_number":253,"context_line":"            protocol_ref \u003d self._get_protocol(session, idp_id, protocol_id)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fzg%3D","line":250,"updated":"2014-02-22 18:51:36.000000000","message":"addition of this method to the federation backend could be split out to a separate commit.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                setattr(mapping_ref, attr, getattr(new_mapping, attr))"},{"line_number":248,"context_line":"        return mapping_ref.to_dict()"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def get_mapping_from_idp_and_protocol(self, idp_id, protocol_id):"},{"line_number":251,"context_line":"        session \u003d db_session.get_session()"},{"line_number":252,"context_line":"        with session.begin():"},{"line_number":253,"context_line":"            protocol_ref \u003d self._get_protocol(session, idp_id, protocol_id)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2FzdE%3D","line":250,"in_reply_to":"AAAAU3%2F%2F%2Fzg%3D","updated":"2014-02-24 18:57:58.000000000","message":"do you suggest making this method a separated patch as well as a dependency of thecurrent one?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                setattr(mapping_ref, attr, getattr(new_mapping, attr))"},{"line_number":248,"context_line":"        return mapping_ref.to_dict()"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def get_mapping_from_idp_and_protocol(self, idp_id, protocol_id):"},{"line_number":251,"context_line":"        session \u003d db_session.get_session()"},{"line_number":252,"context_line":"        with session.begin():"},{"line_number":253,"context_line":"            protocol_ref \u003d self._get_protocol(session, idp_id, protocol_id)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv2I%3D","line":250,"updated":"2014-02-25 00:44:41.000000000","message":"I would prefer it if the change to add a new method to the backend was split out into a separate patch. The change to add new resources and routes should also be split out into a separate patch.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                setattr(mapping_ref, attr, getattr(new_mapping, attr))"},{"line_number":248,"context_line":"        return mapping_ref.to_dict()"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def get_mapping_from_idp_and_protocol(self, idp_id, protocol_id):"},{"line_number":251,"context_line":"        session \u003d db_session.get_session()"},{"line_number":252,"context_line":"        with session.begin():"},{"line_number":253,"context_line":"            protocol_ref \u003d self._get_protocol(session, idp_id, protocol_id)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FubQ%3D","line":250,"in_reply_to":"AAAAU3%2F%2Fv2I%3D","updated":"2014-02-25 03:54:24.000000000","message":"refer to dolphms comment in commit msg from previous patch set (34.. i think?)","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"}],"keystone/contrib/federation/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    collection_name \u003d \u0027tokens\u0027"},{"line_number":301,"context_line":"    member_name \u003d \u0027token\u0027"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def _get_assertion_params_from_env(self, context):"},{"line_number":304,"context_line":"        prefix \u003d CONF.federation.assertion_prefix"},{"line_number":305,"context_line":"        for k, v in context[\u0027environment\u0027].iteritems():"},{"line_number":306,"context_line":"            if k.startswith(prefix):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lGU%3D","line":303,"updated":"2014-02-05 22:23:56.000000000","message":"what\u0027s the harm in sending everything from context[environment] over?","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    collection_name \u003d \u0027tokens\u0027"},{"line_number":301,"context_line":"    member_name \u003d \u0027token\u0027"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def _get_assertion_params_from_env(self, context):"},{"line_number":304,"context_line":"        prefix \u003d CONF.federation.assertion_prefix"},{"line_number":305,"context_line":"        for k, v in context[\u0027environment\u0027].iteritems():"},{"line_number":306,"context_line":"            if k.startswith(prefix):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iK0%3D","line":303,"in_reply_to":"AAAAUH%2F9lGU%3D","updated":"2014-02-06 09:46:05.000000000","message":"I don\u0027t see any point in pushing whole environment to the RuleProcessor. It\u0027s relatively easy to fetch only parameters that we need.\nPlus, there might be a situation where somebody will be able to *somehow* access all environment variables by adding some malicious rules.\nHence, I vote for sending over only the subset of variables that will be used.","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            if k.startswith(prefix):"},{"line_number":307,"context_line":"                yield (k, v)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def _refactor(self, properties):"},{"line_number":310,"context_line":"        return {"},{"line_number":311,"context_line":"            \u0027name\u0027: properties.get(\u0027user\u0027),"},{"line_number":312,"context_line":"            \u0027groups\u0027: [x for x in properties if \u0027group\u0027 in x]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lHM%3D","line":309,"updated":"2014-02-05 22:23:56.000000000","message":"you can get rid of this function, i\u0027ve moved it into the assertProcessor.","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            if k.startswith(prefix):"},{"line_number":307,"context_line":"                yield (k, v)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def _refactor(self, properties):"},{"line_number":310,"context_line":"        return {"},{"line_number":311,"context_line":"            \u0027name\u0027: properties.get(\u0027user\u0027),"},{"line_number":312,"context_line":"            \u0027groups\u0027: [x for x in properties if \u0027group\u0027 in x]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iKs%3D","line":309,"in_reply_to":"AAAAUH%2F9lHM%3D","updated":"2014-02-06 09:46:05.000000000","message":"will be removed.","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        Assume the mapped_properties are in a format:"},{"line_number":331,"context_line":"            {"},{"line_number":332,"context_line":"                \u0027name\u0027: \u0027foobar\u0027,"},{"line_number":333,"context_line":"                \u0027groups\u0027: [ {\"id\": \"abc123\"}, {\"id\": \"def456\"} ]"},{"line_number":334,"context_line":"            }"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lFs%3D","line":333,"updated":"2014-02-05 22:23:56.000000000","message":"it\u0027ll be \u0027group_ids\u0027: [\u0027123\u0027, \u0027xyz\u0027]","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        Assume the mapped_properties are in a format:"},{"line_number":331,"context_line":"            {"},{"line_number":332,"context_line":"                \u0027name\u0027: \u0027foobar\u0027,"},{"line_number":333,"context_line":"                \u0027groups\u0027: [ {\"id\": \"abc123\"}, {\"id\": \"def456\"} ]"},{"line_number":334,"context_line":"            }"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iKQ%3D","line":333,"in_reply_to":"AAAAUH%2F9lFs%3D","updated":"2014-02-06 09:46:05.000000000","message":"++","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":341,"context_line":"                \u0027name\u0027: mapped_properties[\u0027name\u0027],"},{"line_number":342,"context_line":"                \u0027groups\u0027: mapped_properties[\u0027groups\u0027],"},{"line_number":343,"context_line":"                \u0027OS-FEDERATION:protocol\u0027: {"},{"line_number":344,"context_line":"                    \u0027id\u0027: self.protocol,"},{"line_number":345,"context_line":"                    \u0027links\u0027: {"},{"line_number":346,"context_line":"                        \u0027self\u0027: self._url()"},{"line_number":347,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lFY%3D","line":344,"updated":"2014-02-05 22:23:56.000000000","message":"get rid of id here","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":341,"context_line":"                \u0027name\u0027: mapped_properties[\u0027name\u0027],"},{"line_number":342,"context_line":"                \u0027groups\u0027: mapped_properties[\u0027groups\u0027],"},{"line_number":343,"context_line":"                \u0027OS-FEDERATION:protocol\u0027: {"},{"line_number":344,"context_line":"                    \u0027id\u0027: self.protocol,"},{"line_number":345,"context_line":"                    \u0027links\u0027: {"},{"line_number":346,"context_line":"                        \u0027self\u0027: self._url()"},{"line_number":347,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iKE%3D","line":344,"in_reply_to":"AAAAUH%2F9lFY%3D","updated":"2014-02-06 09:46:05.000000000","message":"Done","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a9a8e497e5a166fa5146f1b2b4b005117f6c849c","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        return MappingController.wrap_member(context, mapping_ref)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"@dependency.requires(\u0027federation_api\u0027, \u0027token_provider_api\u0027)"},{"line_number":300,"context_line":"class AuthController(controller.V3Controller):"},{"line_number":301,"context_line":"    collection_name \u003d \u0027tokens\u0027"},{"line_number":302,"context_line":"    member_name \u003d \u0027token\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fxqc%3D","line":299,"updated":"2014-02-10 21:54:45.000000000","message":"Do not make this a top level controller.   A different token Provider and auth plugin. plus some refactoring of the existing code to make it more of a pipeline is more appropriate.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"095e863e1463a158aca569d59abae0bbe8d965d5","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        return MappingController.wrap_member(context, mapping_ref)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"@dependency.requires(\u0027federation_api\u0027, \u0027token_provider_api\u0027)"},{"line_number":300,"context_line":"class AuthController(controller.V3Controller):"},{"line_number":301,"context_line":"    collection_name \u003d \u0027tokens\u0027"},{"line_number":302,"context_line":"    member_name \u003d \u0027token\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FK6c%3D","line":299,"in_reply_to":"AAAAUX%2F%2FK9k%3D","updated":"2014-02-15 07:13:24.000000000","message":"Continued, since this function is meant to respond to the URL that the apache modules use, it wouldn\u0027t be safe to assume something is always going to be in the context/environment (just so we can switch to a specific auth module).\n\nI think moving this to auth.controller is a better spot, but this specific piece can\u0027t have it\u0027s own auth plugin.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b512bc1531839211633788341e94949f5adf3a46","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        return MappingController.wrap_member(context, mapping_ref)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"@dependency.requires(\u0027federation_api\u0027, \u0027token_provider_api\u0027)"},{"line_number":300,"context_line":"class AuthController(controller.V3Controller):"},{"line_number":301,"context_line":"    collection_name \u003d \u0027tokens\u0027"},{"line_number":302,"context_line":"    member_name \u003d \u0027token\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FK9k%3D","line":299,"in_reply_to":"AAAAUX%2F%2Fxqc%3D","updated":"2014-02-15 06:41:00.000000000","message":"@Adam,\nThe changes here are to retrieve an *unscoped* federation token, (with idp info, and method name \u003d federation, and group info) via the apache modules. Not the final token.\n\nAs you suggested, we do use a different token provider and auth plugin, to send back the final token, since that request will come via the usual /auth/tokens path.\n\nI could move to this to keystone.auth.controller, and have it extend the Auth class? Most of this would remain the same though.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0158582e0929d35706253c957d8769ad2c1f6216","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        return entity"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    #FIXME(marek-denis): add @controller.protected()"},{"line_number":350,"context_line":"    def authenticate(self, context, identity_provider, protocol):"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        self.identity_provider \u003d identity_provider"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJt8%3D","line":349,"updated":"2014-02-15 23:12:13.000000000","message":"why??","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0158582e0929d35706253c957d8769ad2c1f6216","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def authenticate(self, context, identity_provider, protocol):"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        self.identity_provider \u003d identity_provider"},{"line_number":353,"context_line":"        self.protocol \u003d protocol"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        #TODO(marek-denis): Uncomment below when mapping engine is ready"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2FJtw%3D","line":353,"updated":"2014-02-15 23:12:13.000000000","message":"don\u0027t assign request attributes to the controller -- that will cause terrible, terrible bugs with concurrency","commit_id":"51cbc1418e2a23575bf6a46e284765668da15ff8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2474756723ae53de4bb7bec182369c9c47fea69d","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        return entity"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    #FIXME(marek-denis): add @controller.protected()"},{"line_number":350,"context_line":"    def authenticate(self, context, identity_provider, protocol):"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        self.identity_provider \u003d identity_provider"},{"line_number":353,"context_line":"        self.protocol \u003d protocol"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2FJbM%3D","line":350,"updated":"2014-02-16 04:13:22.000000000","message":"will be renamed to get_unscoped_token (or something similar)... and all of these changes will be placed in auth.plugins.federation.","commit_id":"a5719044a3879defdb3939ea3aba163d37d88e84"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        self.get_member_from_driver \u003d self.assignment_api.get_domain"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    @controller.protected()"},{"line_number":303,"context_line":"    def list_accessible_domains(self, context):"},{"line_number":304,"context_line":"        \"\"\"List all domains available to an authenticated user."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fyo%3D","line":303,"updated":"2014-02-22 18:51:36.000000000","message":"The commit message doesn\u0027t say anything about adding new controllers and functions. What is this doing here?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        self.get_member_from_driver \u003d self.assignment_api.get_domain"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    @controller.protected()"},{"line_number":303,"context_line":"    def list_accessible_domains(self, context):"},{"line_number":304,"context_line":"        \"\"\"List all domains available to an authenticated user."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fzcw%3D","line":303,"in_reply_to":"AAAAU3%2F%2F%2Fyo%3D","updated":"2014-02-24 18:57:58.000000000","message":"OK, let me change the commit message.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @controller.protected()"},{"line_number":252,"context_line":"    def list_domains_for_groups(self, context):"},{"line_number":253,"context_line":"        \"\"\"List all domains available to an authenticated user."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        :param context: request context"},{"line_number":256,"context_line":"        :returns: list of accessible domains"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvn8%3D","line":253,"updated":"2014-02-25 00:44:41.000000000","message":"if this is supposed to list the domains for a user then this should be called \"list_domains_for_user\"","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @controller.protected()"},{"line_number":252,"context_line":"    def list_domains_for_groups(self, context):"},{"line_number":253,"context_line":"        \"\"\"List all domains available to an authenticated user."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        :param context: request context"},{"line_number":256,"context_line":"        :returns: list of accessible domains"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvVg%3D","line":253,"in_reply_to":"AAAAU3%2F%2Fvn8%3D","updated":"2014-02-25 03:54:24.000000000","message":"but it\u0027s not using the user to filter it out, suggest change the comment instead ... \n\n\"\"\"List all projects available to an authenticated user\u0027s groups.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        :returns: list of accessible domains"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        \"\"\""},{"line_number":259,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":260,"context_line":"        domains \u003d self.assignment_api.list_domains_for_groups("},{"line_number":261,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":262,"context_line":"        return DomainV3.wrap_collection(context, domains)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvpM%3D","line":259,"updated":"2014-02-25 00:44:41.000000000","message":"where is KEYSTONE_AUTH_CONTEXT coming from?","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        :returns: list of accessible domains"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        \"\"\""},{"line_number":259,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":260,"context_line":"        domains \u003d self.assignment_api.list_domains_for_groups("},{"line_number":261,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":262,"context_line":"        return DomainV3.wrap_collection(context, domains)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvW8%3D","line":259,"in_reply_to":"AAAAU3%2F%2FvpM%3D","updated":"2014-02-25 03:54:24.000000000","message":"from here: https://github.com/openstack/keystone/blob/master/keystone/common/authorization.py#L25","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        self.get_member_from_driver \u003d self.assignment_api.get_project"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    @controller.protected()"},{"line_number":275,"context_line":"    def list_projects_for_groups(self, context):"},{"line_number":276,"context_line":"        \"\"\"List all projects available to an authenticated user."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvnw%3D","line":275,"updated":"2014-02-25 00:44:41.000000000","message":"if this is supposed to list the project for a user then this should be called \"list_projects_for_user\"","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        self.get_member_from_driver \u003d self.assignment_api.get_project"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    @controller.protected()"},{"line_number":275,"context_line":"    def list_projects_for_groups(self, context):"},{"line_number":276,"context_line":"        \"\"\"List all projects available to an authenticated user."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        :param context: request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvVY%3D","line":275,"in_reply_to":"AAAAU3%2F%2Fvnw%3D","updated":"2014-02-25 03:54:24.000000000","message":"same as above","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        :returns: list of accessible domains"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        \"\"\""},{"line_number":259,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":260,"context_line":"        domains \u003d self.assignment_api.list_domains_for_groups("},{"line_number":261,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":262,"context_line":"        return DomainV3.wrap_collection(context, domains)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FK4%3D","line":259,"updated":"2014-02-27 00:59:19.000000000","message":"Use keystone.common.authorizaion.AUTH_CONTEXT_ENV rather than the magic number here since that\u0027s already defined.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f244853c5cf9b8e2b774f5c0f62168538365ee3b","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        :returns: list of accessible domains"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        \"\"\""},{"line_number":259,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":260,"context_line":"        domains \u003d self.assignment_api.list_domains_for_groups("},{"line_number":261,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":262,"context_line":"        return DomainV3.wrap_collection(context, domains)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F920%3D","line":259,"in_reply_to":"AAAAVX%2F%2F%2FK4%3D","updated":"2014-02-27 04:45:28.000000000","message":"++","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        :returns: list of accessible domains"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        \"\"\""},{"line_number":259,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":260,"context_line":"        domains \u003d self.assignment_api.list_domains_for_groups("},{"line_number":261,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":262,"context_line":"        return DomainV3.wrap_collection(context, domains)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Yw%3D","line":259,"in_reply_to":"AAAAVX%2F%2F%2FK4%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        :returns: list of accessible projects"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        \"\"\""},{"line_number":282,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":283,"context_line":"        projects \u003d self.assignment_api.list_projects_for_groups("},{"line_number":284,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":285,"context_line":"        return ProjectV3.wrap_collection(context, projects)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FKM%3D","line":282,"updated":"2014-02-27 00:59:19.000000000","message":"Use keystone.common.authorizaion.AUTH_CONTEXT_ENV rather than the magic number here since that\u0027s already defined.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f244853c5cf9b8e2b774f5c0f62168538365ee3b","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        :returns: list of accessible projects"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        \"\"\""},{"line_number":282,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":283,"context_line":"        projects \u003d self.assignment_api.list_projects_for_groups("},{"line_number":284,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":285,"context_line":"        return ProjectV3.wrap_collection(context, projects)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F92w%3D","line":282,"in_reply_to":"AAAAVX%2F%2F%2FKM%3D","updated":"2014-02-27 04:45:28.000000000","message":"++","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        :returns: list of accessible projects"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        \"\"\""},{"line_number":282,"context_line":"        auth_context \u003d context[\u0027environment\u0027][\u0027KEYSTONE_AUTH_CONTEXT\u0027]"},{"line_number":283,"context_line":"        projects \u003d self.assignment_api.list_projects_for_groups("},{"line_number":284,"context_line":"            auth_context[\u0027group_ids\u0027])"},{"line_number":285,"context_line":"        return ProjectV3.wrap_collection(context, projects)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Ys%3D","line":282,"in_reply_to":"AAAAVX%2F%2F%2FKM%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}],"keystone/contrib/federation/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    @abc.abstractmethod"},{"line_number":200,"context_line":"    def get_mapping_from_idp_and_protocol(self, idp_id, protocol_id):"},{"line_number":201,"context_line":"        \"\"\"Get mapping basing on idp_id and proto_id."},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        :param idp_id: id of the identity provider"},{"line_number":204,"context_line":"        :type idp_id: string"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fz8%3D","line":201,"updated":"2014-02-22 18:51:36.000000000","message":"change \"basing\" to \"based\"\n\nchange \"proto_id\" to \"protocol_id\"","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    @abc.abstractmethod"},{"line_number":200,"context_line":"    def get_mapping_from_idp_and_protocol(self, idp_id, protocol_id):"},{"line_number":201,"context_line":"        \"\"\"Get mapping basing on idp_id and proto_id."},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        :param idp_id: id of the identity provider"},{"line_number":204,"context_line":"        :type idp_id: string"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0m4%3D","line":201,"in_reply_to":"AAAAU3%2F%2F%2Fz8%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"}],"keystone/contrib/federation/routers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27f44a572befa0a91904186ef03ffa60a808a298","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                                \u0027protocol/{protocol}\u0027),"},{"line_number":168,"context_line":"            controller\u003dauth_controller,"},{"line_number":169,"context_line":"            action\u003d\u0027authenticate\u0027,"},{"line_number":170,"context_line":"            conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9lAw%3D","line":170,"updated":"2014-02-05 22:23:56.000000000","message":"i think method should be POST, that is typically what is used for getting a token","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                                \u0027protocol/{protocol}\u0027),"},{"line_number":168,"context_line":"            controller\u003dauth_controller,"},{"line_number":169,"context_line":"            action\u003d\u0027authenticate\u0027,"},{"line_number":170,"context_line":"            conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iJM%3D","line":170,"in_reply_to":"AAAAUH%2F9lAw%3D","updated":"2014-02-06 09:46:05.000000000","message":"Normally yes. But this URL will be mod_shib protected, so I it\u0027s slightly different situation, and POST might not be an option in this case (SAML internals).\nI\u0027d keep GET for now, and update it later.","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a9a8e497e5a166fa5146f1b2b4b005117f6c849c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        idp_controller \u003d controllers.IdentityProvider()"},{"line_number":59,"context_line":"        protocol_controller \u003d controllers.FederationProtocol()"},{"line_number":60,"context_line":"        mapping_controller \u003d controllers.MappingController()"},{"line_number":61,"context_line":"        auth_controller \u003d controllers.AuthController()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # Identity Provider CRUD operations"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fxec%3D","line":61,"updated":"2014-02-10 21:54:45.000000000","message":"remove","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a9a8e497e5a166fa5146f1b2b4b005117f6c849c","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            conditions\u003ddict(method\u003d[\u0027PATCH\u0027]))"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Assertion consuming"},{"line_number":165,"context_line":"        mapper.connect("},{"line_number":166,"context_line":"            self._construct_url(\u0027token/identity_provider/{identity_provider}/\u0027"},{"line_number":167,"context_line":"                                \u0027protocol/{protocol}\u0027),"},{"line_number":168,"context_line":"            controller\u003dauth_controller,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fxeg%3D","line":165,"updated":"2014-02-10 21:54:45.000000000","message":"remove","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b512bc1531839211633788341e94949f5adf3a46","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            conditions\u003ddict(method\u003d[\u0027PATCH\u0027]))"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Assertion consuming"},{"line_number":165,"context_line":"        mapper.connect("},{"line_number":166,"context_line":"            self._construct_url(\u0027token/identity_provider/{identity_provider}/\u0027"},{"line_number":167,"context_line":"                                \u0027protocol/{protocol}\u0027),"},{"line_number":168,"context_line":"            controller\u003dauth_controller,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FK9s%3D","line":165,"in_reply_to":"AAAAUX%2F%2Fxeg%3D","updated":"2014-02-15 06:41:00.000000000","message":"We still need to define this route somewhere. \nThe apache modules protect certain URLs, which is why we want to protect /v3/tokens/idp/$idp/protocol/$protocol.\nIf we protected /v3/tokens, then normal keystone auth wouldn\u0027t work.\n\nWould it be better to define it in keystone.auth.routers?","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dada69a3eda415ce411bf71d417e2dad568fd0bc","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Assertion consuming"},{"line_number":165,"context_line":"        mapper.connect("},{"line_number":166,"context_line":"            self._construct_url(\u0027token/identity_provider/{identity_provider}/\u0027"},{"line_number":167,"context_line":"                                \u0027protocol/{protocol}\u0027),"},{"line_number":168,"context_line":"            controller\u003dauth_controller,"},{"line_number":169,"context_line":"            action\u003d\u0027authenticate\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F0FQ%3D","line":166,"updated":"2014-02-10 16:59:53.000000000","message":"Need some help with proper URLs.","commit_id":"1cd99c11b0f1a51e114082003ab13ba0600a96eb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2474756723ae53de4bb7bec182369c9c47fea69d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                                \u0027protocol/{protocol}\u0027),"},{"line_number":165,"context_line":"            controller\u003dauth_controller,"},{"line_number":166,"context_line":"            action\u003d\u0027authenticate\u0027,"},{"line_number":167,"context_line":"            conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2FJbQ%3D","line":167,"updated":"2014-02-16 04:13:22.000000000","message":"my plan is to move this to auth routers, and have it call authenticate_unscoped_federation - a new function, which will call the federation plugin","commit_id":"a5719044a3879defdb3939ea3aba163d37d88e84"}],"keystone/contrib/federation/utils.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                    new_local \u003d self._update_local_mapping(local, direct_maps)"},{"line_number":192,"context_line":"                    identity_values.append(new_local)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        mapped_properties \u003d self._transform(identity_values)"},{"line_number":195,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":196,"context_line":"            raise exception.Unauthorized(_(\"Could not map user\"))"},{"line_number":197,"context_line":"        return mapped_properties"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FJo%3D","line":194,"updated":"2014-02-27 00:59:19.000000000","message":"this should be done in a separate commit.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                    new_local \u003d self._update_local_mapping(local, direct_maps)"},{"line_number":192,"context_line":"                    identity_values.append(new_local)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        mapped_properties \u003d self._transform(identity_values)"},{"line_number":195,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":196,"context_line":"            raise exception.Unauthorized(_(\"Could not map user\"))"},{"line_number":197,"context_line":"        return mapped_properties"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Ww%3D","line":194,"in_reply_to":"AAAAVX%2F%2F%2FJo%3D","updated":"2014-02-27 13:17:45.000000000","message":"why? Because we are dealing with RuleProcessor related operations?","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    identity_values.append(new_local)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        mapped_properties \u003d self._transform(identity_values)"},{"line_number":195,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":196,"context_line":"            raise exception.Unauthorized(_(\"Could not map user\"))"},{"line_number":197,"context_line":"        return mapped_properties"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FCA%3D","line":195,"updated":"2014-02-27 00:59:19.000000000","message":"use \"\u0027name\u0027 in mapped_properties\" since we don\u0027t care about the value, right?","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    identity_values.append(new_local)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        mapped_properties \u003d self._transform(identity_values)"},{"line_number":195,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":196,"context_line":"            raise exception.Unauthorized(_(\"Could not map user\"))"},{"line_number":197,"context_line":"        return mapped_properties"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Xw%3D","line":195,"in_reply_to":"AAAAVX%2F%2F%2FCA%3D","updated":"2014-02-27 13:17:45.000000000","message":"I think we should stay with mapped_properties.get().\nIn fact we do care whether \u0027name\u0027 is not None, as this value is later urllib.quote()\u0027d and stored in the token data. RuleProcess by default results {\u0027name\u0027: None}, see lines 199-232.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f244853c5cf9b8e2b774f5c0f62168538365ee3b","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    identity_values.append(new_local)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        mapped_properties \u003d self._transform(identity_values)"},{"line_number":195,"context_line":"        if mapped_properties.get(\u0027name\u0027) is None:"},{"line_number":196,"context_line":"            raise exception.Unauthorized(_(\"Could not map user\"))"},{"line_number":197,"context_line":"        return mapped_properties"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F92o%3D","line":195,"in_reply_to":"AAAAVX%2F%2F%2FCA%3D","updated":"2014-02-27 04:45:28.000000000","message":"correct","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}],"keystone/tests/mapping_fixtures.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b2e5fd37732575f21e1dbf974c7df7cdcdc263b","unresolved":false,"context_lines":[{"line_number":385,"context_line":"    \u0027orgPersonType\u0027: \u0027Admin;Chief;\u0027"},{"line_number":386,"context_line":"}"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"HACKER_ASSERTION \u003d {"},{"line_number":389,"context_line":"    \u0027Email\u0027: \u0027haxor@example.com\u0027,"},{"line_number":390,"context_line":"    \u0027UserName\u0027: \u0027bob\u0027,"},{"line_number":391,"context_line":"    \u0027FirstName\u0027: \u0027Bob\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqN4%3D","line":388,"updated":"2014-02-19 23:25:02.000000000","message":"this doesn\u0027t seem to be used in the tests","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9b257f39131ba3125f0e9b29efea63bb7ad31260","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            ]"},{"line_number":192,"context_line":"        }"},{"line_number":193,"context_line":"    ]"},{"line_number":194,"context_line":"}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"MAPPING_BAD_REQ \u003d {"},{"line_number":197,"context_line":"    \"rules\": ["}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAU3%2F%2FnYQ%3D","line":194,"updated":"2014-02-25 16:54:08.000000000","message":"revert white space change, this might cause pep8 failure","commit_id":"59a08af7f2ccdd33d627abfa031d3e5cc26a8971"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b35474790d327792a19449aad3d44b69b59d3ae0","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            ]"},{"line_number":192,"context_line":"        }"},{"line_number":193,"context_line":"    ]"},{"line_number":194,"context_line":"}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"MAPPING_BAD_REQ \u003d {"},{"line_number":197,"context_line":"    \"rules\": ["}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAU3%2F%2FnSg%3D","line":194,"in_reply_to":"AAAAU3%2F%2FnYQ%3D","updated":"2014-02-25 17:13:15.000000000","message":"done","commit_id":"59a08af7f2ccdd33d627abfa031d3e5cc26a8971"}],"keystone/tests/test_overrides.conf":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":31,"context_line":"[auth]"},{"line_number":32,"context_line":"methods \u003d external,password,token,oauth1,saml2"},{"line_number":33,"context_line":"oauth1 \u003d keystone.auth.plugins.oauth1.OAuth"},{"line_number":34,"context_line":"saml2 \u003d keystone.auth.plugins.saml2.Saml2"},{"line_number":35,"context_line":"[paste_deploy]"},{"line_number":36,"context_line":"config_file \u003d keystone-paste.ini"}],"source_content_type":"text/plain","patch_set":36,"id":"AAAAU3%2F%2Fvmk%3D","line":34,"updated":"2014-02-25 00:44:41.000000000","message":"add a blank line after this line.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":31,"context_line":"[auth]"},{"line_number":32,"context_line":"methods \u003d external,password,token,oauth1,saml2"},{"line_number":33,"context_line":"oauth1 \u003d keystone.auth.plugins.oauth1.OAuth"},{"line_number":34,"context_line":"saml2 \u003d keystone.auth.plugins.saml2.Saml2"},{"line_number":35,"context_line":"[paste_deploy]"},{"line_number":36,"context_line":"config_file \u003d keystone-paste.ini"}],"source_content_type":"text/plain","patch_set":36,"id":"AAAAU3%2F%2Fues%3D","line":34,"in_reply_to":"AAAAU3%2F%2Fvmk%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"}],"keystone/tests/test_v3_federation.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d70671837295c2e2e0cf9f13e7abbda373bcced","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        - mapping rules for the mapping engine"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"        \"\"\""},{"line_number":620,"context_line":"        self.domainA \u003d self.new_domain_ref()"},{"line_number":621,"context_line":"        self.assignment_api.create_domain(self.domainA[\u0027id\u0027], self.domainA)"},{"line_number":622,"context_line":"        self.domainB \u003d self.new_domain_ref()"},{"line_number":623,"context_line":"        self.assignment_api.create_domain(self.domainB[\u0027id\u0027], self.domainB)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9iIw%3D","line":620,"updated":"2014-02-06 09:46:05.000000000","message":"Shamelessly copy/pasted from ayoung\u0027s (I guess) test method :-)","commit_id":"8e6503ca71ac15414508aa6d576391b123f00d8c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f3495a23bab1c1a67ec42356fbd5cbd7a626357","unresolved":false,"context_lines":[{"line_number":866,"context_line":"        :param context: request context"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        \"\"\""},{"line_number":869,"context_line":"        RULES \u003d {"},{"line_number":870,"context_line":"            \u0027PROJ_ALL\u0027: {"},{"line_number":871,"context_line":"                \u0027group_ids\u0027: ["},{"line_number":872,"context_line":"                    self.group1[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FcBQ%3D","line":869,"updated":"2014-02-13 08:00:21.000000000","message":"I\u0027m tempted to say to put this in mapping fixtures.","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"6d03bd5090813e4f07993f2bf1c0156f1294b893","unresolved":false,"context_lines":[{"line_number":866,"context_line":"        :param context: request context"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        \"\"\""},{"line_number":869,"context_line":"        RULES \u003d {"},{"line_number":870,"context_line":"            \u0027PROJ_ALL\u0027: {"},{"line_number":871,"context_line":"                \u0027group_ids\u0027: ["},{"line_number":872,"context_line":"                    self.group1[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Fbis%3D","line":869,"in_reply_to":"AAAAUX%2F%2FcBQ%3D","updated":"2014-02-13 09:09:00.000000000","message":"+1","commit_id":"dbf14daf95c5d7cecb8879f0117e7dcba3190c94"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f07db3347e7c07925bc419119a150bb253a9944a","unresolved":false,"context_lines":[{"line_number":833,"context_line":"        self.post(url, body\u003dself.TOKEN_INPUT_B_FROM_WRONG_TOKEN,"},{"line_number":834,"context_line":"                  expected_status\u003d404)"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"    def load_federation_sample_data(self):"},{"line_number":837,"context_line":"        \"\"\"Inject additional data."},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        Prepare:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIvg%3D","line":836,"updated":"2014-02-16 13:47:27.000000000","message":"Why was this moved back to test_v3_federation.py ?","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3157bd022cf5309d5dc2bfae6b0b62ea9a14ba25","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import random"},{"line_number":14,"context_line":"import uuid"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import urllib"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.auth import controllers as auth_controllers"},{"line_number":19,"context_line":"from keystone.common.sql import migration"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUX%2F%2B8Bs%3D","line":16,"updated":"2014-02-18 04:22:10.000000000","message":"I think we can group this with uuid and random since urllib is a standard library","commit_id":"c328c1ab0821ae108010799a0a6227c8a9627cf8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b2e5fd37732575f21e1dbf974c7df7cdcdc263b","unresolved":false,"context_lines":[{"line_number":963,"context_line":""},{"line_number":964,"context_line":"        self.rules \u003d {"},{"line_number":965,"context_line":"            \"rules\": ["},{"line_number":966,"context_line":"                {"},{"line_number":967,"context_line":"                    \"local\": ["},{"line_number":968,"context_line":"                        {"},{"line_number":969,"context_line":"                            \"group\": {"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqMc%3D","line":966,"updated":"2014-02-19 23:25:02.000000000","message":"for the rules, i simplified them a bit... \n\ni removed all the restrictions on the remote side, all \"not_any_of\"s have been removed.\n\nI also added blocks to do mapping of usernames, so the rule processor will actually have a name, we should add a test to run with an assertion that will fail (and expect a 401)","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b2e5fd37732575f21e1dbf974c7df7cdcdc263b","unresolved":false,"context_lines":[{"line_number":1145,"context_line":"                },"},{"line_number":1146,"context_line":"                \"scope\": {"},{"line_number":1147,"context_line":"                    \"project\": {"},{"line_number":1148,"context_line":"                        \"id\": self.project_customers[\u0027id\u0027]"},{"line_number":1149,"context_line":"                    }"},{"line_number":1150,"context_line":"                }"},{"line_number":1151,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqNk%3D","line":1148,"updated":"2014-02-19 23:25:02.000000000","message":"you mixed up contractor and customer in a bunch of spots, i\u0027m going to change them all to customer.","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"52a2a1e2d81022b1948dec515bcab0e3e9d9a936","unresolved":false,"context_lines":[{"line_number":920,"context_line":"            \u0027project_id\u0027: self.project_employees[\u0027id\u0027]"},{"line_number":921,"context_line":"        }"},{"line_number":922,"context_line":"        self.assignment_api.create_grant(self.role_employee[\u0027id\u0027],"},{"line_number":923,"context_line":"                                         **kwargs)"},{"line_number":924,"context_line":"        kwargs \u003d {"},{"line_number":925,"context_line":"            \u0027group_id\u0027: self.group_employees[\u0027id\u0027],"},{"line_number":926,"context_line":"            \u0027project_id\u0027: self.project_all[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAUX%2F%2BpJU%3D","line":923,"updated":"2014-02-20 02:17:23.000000000","message":"stop building kwargs dictionaries just to call methods -- just pass in the keyword arguments and be done","commit_id":"c65281760825b404436377e2be48877bc0cdf4b4"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5799a3ac1eb185c5a628c7f8a7992b35bff6321c","unresolved":false,"context_lines":[{"line_number":769,"context_line":"            \u0027rules\u0027: rules"},{"line_number":770,"context_line":"        }"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def _scope_request(self, unscoped_token_id, scope, id):"},{"line_number":773,"context_line":"        return {"},{"line_number":774,"context_line":"            \"auth\": {"},{"line_number":775,"context_line":"                \"identity\": {"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAUX%2F%2BXZU%3D","line":772,"updated":"2014-02-21 16:00:02.000000000","message":"nit: change id to scope_id","commit_id":"a543d5d0dc82fa90fbe958ed8c5d8712afdbb429"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"945778fda0bdc7fc9c469b5b7db85b3d111b5988","unresolved":false,"context_lines":[{"line_number":769,"context_line":"            \u0027rules\u0027: rules"},{"line_number":770,"context_line":"        }"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def _scope_request(self, unscoped_token_id, scope, id):"},{"line_number":773,"context_line":"        return {"},{"line_number":774,"context_line":"            \"auth\": {"},{"line_number":775,"context_line":"                \"identity\": {"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAAUX%2F%2BXW4%3D","line":772,"in_reply_to":"AAAAUX%2F%2BXZU%3D","updated":"2014-02-21 16:02:05.000000000","message":"patch on its\u0027 way!","commit_id":"a543d5d0dc82fa90fbe958ed8c5d8712afdbb429"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import urllib"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.auth import controllers as auth_controllers"},{"line_number":19,"context_line":"from keystone.common.sql import migration"},{"line_number":20,"context_line":"from keystone import config"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FyU%3D","line":17,"updated":"2014-02-22 18:51:36.000000000","message":"remove extra blank line.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import urllib"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.auth import controllers as auth_controllers"},{"line_number":19,"context_line":"from keystone.common.sql import migration"},{"line_number":20,"context_line":"from keystone import config"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0mU%3D","line":17,"in_reply_to":"AAAAU3%2F%2F%2FyU%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        super(FederationTests, self).setup_database()"},{"line_number":46,"context_line":"        package_name \u003d \u0027.\u0027.join((contrib.__name__, self.EXTENSION_NAME))"},{"line_number":47,"context_line":"        package \u003d importutils.import_module(package_name)"},{"line_number":48,"context_line":"        migration.db_version_control(package\u003dpackage)"},{"line_number":49,"context_line":"        migration.db_sync(package\u003dpackage)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FyQ%3D","line":48,"updated":"2014-02-22 18:51:36.000000000","message":"why this change? it\u0027s not mentioned in the commit message.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        super(FederationTests, self).setup_database()"},{"line_number":46,"context_line":"        package_name \u003d \u0027.\u0027.join((contrib.__name__, self.EXTENSION_NAME))"},{"line_number":47,"context_line":"        package \u003d importutils.import_module(package_name)"},{"line_number":48,"context_line":"        migration.db_version_control(package\u003dpackage)"},{"line_number":49,"context_line":"        migration.db_sync(package\u003dpackage)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2FzaI%3D","line":48,"in_reply_to":"AAAAU3%2F%2F%2FyQ%3D","updated":"2014-02-24 18:57:58.000000000","message":"result of some auto-rebase operation.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7134aa4c2e0b68245420bcbd6ecb7cae9ef1e4c1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        super(FederationTests, self).setup_database()"},{"line_number":46,"context_line":"        package_name \u003d \u0027.\u0027.join((contrib.__name__, self.EXTENSION_NAME))"},{"line_number":47,"context_line":"        package \u003d importutils.import_module(package_name)"},{"line_number":48,"context_line":"        migration.db_version_control(package\u003dpackage)"},{"line_number":49,"context_line":"        migration.db_sync(package\u003dpackage)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2FzX8%3D","line":48,"in_reply_to":"AAAAU3%2F%2F%2FyQ%3D","updated":"2014-02-24 18:05:57.000000000","message":"this was a side-effect of a rebase, we can get rid of this change","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    def idp_ref(self, id\u003dNone):"},{"line_number":746,"context_line":"        idp \u003d {"},{"line_number":747,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":748,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":749,"context_line":"            \u0027description\u0027: uuid.uuid4().hex"},{"line_number":750,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F9Tc%3D","line":747,"updated":"2014-02-23 14:37:20.000000000","message":"Suggest using \u0027id or uuid.uuid4().hex\u0027 and then removing the \u0027if\u0027 statement below.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dc712c481225d14f3252db0363faef7a2cbf3c8a","unresolved":false,"context_lines":[{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    def idp_ref(self, id\u003dNone):"},{"line_number":746,"context_line":"        idp \u003d {"},{"line_number":747,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":748,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":749,"context_line":"            \u0027description\u0027: uuid.uuid4().hex"},{"line_number":750,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fz5Y%3D","line":747,"in_reply_to":"AAAAU3%2F%2F9Tc%3D","updated":"2014-02-24 17:26:34.000000000","message":"++","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    def idp_ref(self, id\u003dNone):"},{"line_number":746,"context_line":"        idp \u003d {"},{"line_number":747,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":748,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":749,"context_line":"            \u0027description\u0027: uuid.uuid4().hex"},{"line_number":750,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0lQ%3D","line":747,"in_reply_to":"AAAAU3%2F%2F9Tc%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        proto \u003d {"},{"line_number":758,"context_line":"            \u0027id\u0027: uuid.uuid4().hex"},{"line_number":759,"context_line":"        }"},{"line_number":760,"context_line":"        if mapping_id is None:"},{"line_number":761,"context_line":"            proto[\u0027mapping_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":762,"context_line":"        else:"},{"line_number":763,"context_line":"            proto[\u0027mapping_id\u0027] \u003d mapping_id"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F9TY%3D","line":760,"updated":"2014-02-23 14:37:20.000000000","message":"I think you can to the same thing here.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        proto \u003d {"},{"line_number":758,"context_line":"            \u0027id\u0027: uuid.uuid4().hex"},{"line_number":759,"context_line":"        }"},{"line_number":760,"context_line":"        if mapping_id is None:"},{"line_number":761,"context_line":"            proto[\u0027mapping_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":762,"context_line":"        else:"},{"line_number":763,"context_line":"            proto[\u0027mapping_id\u0027] \u003d mapping_id"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0lM%3D","line":760,"in_reply_to":"AAAAU3%2F%2F9TY%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def _scope_request(self, unscoped_token_id, scope, scope_id):"},{"line_number":773,"context_line":"        return {"},{"line_number":774,"context_line":"            \"auth\": {"},{"line_number":775,"context_line":"                \"identity\": {"},{"line_number":776,"context_line":"                    \"methods\": ["},{"line_number":777,"context_line":"                        self.AUTH_METHOD"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FyA%3D","line":774,"updated":"2014-02-22 18:51:36.000000000","message":"use \u0027 for strings consistently.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def _scope_request(self, unscoped_token_id, scope, scope_id):"},{"line_number":773,"context_line":"        return {"},{"line_number":774,"context_line":"            \"auth\": {"},{"line_number":775,"context_line":"                \"identity\": {"},{"line_number":776,"context_line":"                    \"methods\": ["},{"line_number":777,"context_line":"                        self.AUTH_METHOD"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0kg%3D","line":774,"in_reply_to":"AAAAU3%2F%2F%2FyA%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":794,"context_line":"    def _roles(self, roles):"},{"line_number":795,"context_line":"        return set([(r[\u0027id\u0027], r[\u0027name\u0027]) for r in roles])"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"    def _validateUserObject(self, user, user_ref):"},{"line_number":798,"context_line":"        for attr in (\u0027id\u0027, \u0027name\u0027):"},{"line_number":799,"context_line":"            self.assertEqual(user[attr], user_ref[attr])"},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fxs%3D","line":797,"updated":"2014-02-22 18:51:36.000000000","message":"use the normal naming for methods -- _validate_user_object() -- also applies at 801 and 817.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":794,"context_line":"    def _roles(self, roles):"},{"line_number":795,"context_line":"        return set([(r[\u0027id\u0027], r[\u0027name\u0027]) for r in roles])"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"    def _validateUserObject(self, user, user_ref):"},{"line_number":798,"context_line":"        for attr in (\u0027id\u0027, \u0027name\u0027):"},{"line_number":799,"context_line":"            self.assertEqual(user[attr], user_ref[attr])"},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0jQ%3D","line":797,"in_reply_to":"AAAAU3%2F%2F%2Fxs%3D","updated":"2014-02-24 18:57:58.000000000","message":"actually this method is not used anymore and should be removed (and it\u0027s now).","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":802,"context_line":"        \"\"\"Check whether the projects and the roles match.\"\"\""},{"line_number":803,"context_line":"        token_roles \u003d token.get(\u0027roles\u0027)"},{"line_number":804,"context_line":"        if token_roles is None:"},{"line_number":805,"context_line":"            raise AssertionError(_(\u0027Roles not found in the token\u0027))"},{"line_number":806,"context_line":"        token_roles \u003d self._roles(token_roles)"},{"line_number":807,"context_line":"        roles_ref \u003d self._roles(roles)"},{"line_number":808,"context_line":"        self.assertEqual(token_roles, roles_ref)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fxo%3D","line":805,"updated":"2014-02-22 18:51:36.000000000","message":"remove _() from these strings. We don\u0027t need to translate test results. This applies throughout this file (e.g., line 812 and 825)","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":802,"context_line":"        \"\"\"Check whether the projects and the roles match.\"\"\""},{"line_number":803,"context_line":"        token_roles \u003d token.get(\u0027roles\u0027)"},{"line_number":804,"context_line":"        if token_roles is None:"},{"line_number":805,"context_line":"            raise AssertionError(_(\u0027Roles not found in the token\u0027))"},{"line_number":806,"context_line":"        token_roles \u003d self._roles(token_roles)"},{"line_number":807,"context_line":"        roles_ref \u003d self._roles(roles)"},{"line_number":808,"context_line":"        self.assertEqual(token_roles, roles_ref)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0jI%3D","line":805,"in_reply_to":"AAAAU3%2F%2F%2Fxo%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":819,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"},{"line_number":820,"context_line":"            self.assertIn(obj, token)"},{"line_number":821,"context_line":"        # Check for either project or domain"},{"line_number":822,"context_line":"        project_domain \u003d [lambda x: x in token for x in"},{"line_number":823,"context_line":"                          (\u0027project\u0027, \u0027domain\u0027)]"},{"line_number":824,"context_line":"        if not all(project_domain) and not any(project_domain):"},{"line_number":825,"context_line":"            raise AssertionError(_(\"Neither project nor domain specified.\"))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUX%2F%2BTlg%3D","line":822,"updated":"2014-02-23 14:37:20.000000000","message":"Can\u0027t these next three lines just be:\n\n    if \u0027project\u0027 not in token and \u0027domain\u0027 not in token:","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":819,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"},{"line_number":820,"context_line":"            self.assertIn(obj, token)"},{"line_number":821,"context_line":"        # Check for either project or domain"},{"line_number":822,"context_line":"        project_domain \u003d [lambda x: x in token for x in"},{"line_number":823,"context_line":"                          (\u0027project\u0027, \u0027domain\u0027)]"},{"line_number":824,"context_line":"        if not all(project_domain) and not any(project_domain):"},{"line_number":825,"context_line":"            raise AssertionError(_(\"Neither project nor domain specified.\"))"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0f0%3D","line":822,"in_reply_to":"AAAAUX%2F%2BTlg%3D","updated":"2014-02-24 18:57:58.000000000","message":"The exception message can be misleading. We should also check  if only domain or project was set. Changing it to use XOR operation.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":854,"context_line":"                  expected_status\u003d401)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"    def test_scope_to_project_multiple_times(self):"},{"line_number":857,"context_line":"        \"\"\"Try to scope the unscoped tokens multiple times."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        The new tokens should be scoped to:"},{"line_number":860,"context_line":"        * Customers\u0027 project"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FxI%3D","line":857,"updated":"2014-02-22 18:51:36.000000000","message":"change \"tokens\" to \"token\"","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":854,"context_line":"                  expected_status\u003d401)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"    def test_scope_to_project_multiple_times(self):"},{"line_number":857,"context_line":"        \"\"\"Try to scope the unscoped tokens multiple times."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        The new tokens should be scoped to:"},{"line_number":860,"context_line":"        * Customers\u0027 project"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0Vs%3D","line":857,"in_reply_to":"AAAAU3%2F%2F%2FxI%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":856,"context_line":"    def test_scope_to_project_multiple_times(self):"},{"line_number":857,"context_line":"        \"\"\"Try to scope the unscoped tokens multiple times."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        The new tokens should be scoped to:"},{"line_number":860,"context_line":"        * Customers\u0027 project"},{"line_number":861,"context_line":"        * Employees\u0027 project"},{"line_number":862,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FxM%3D","line":859,"updated":"2014-02-22 18:51:36.000000000","message":"add a blank line after this for rst.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":856,"context_line":"    def test_scope_to_project_multiple_times(self):"},{"line_number":857,"context_line":"        \"\"\"Try to scope the unscoped tokens multiple times."},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        The new tokens should be scoped to:"},{"line_number":860,"context_line":"        * Customers\u0027 project"},{"line_number":861,"context_line":"        * Employees\u0027 project"},{"line_number":862,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0VI%3D","line":859,"in_reply_to":"AAAAU3%2F%2F%2FxM%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":893,"context_line":"    def test_scope_to_domain_once(self):"},{"line_number":894,"context_line":"        r \u003d self.post(self.AUTH_URL,"},{"line_number":895,"context_line":"                      body\u003dself.TOKEN_SCOPE_DOMAIN_A_FROM_CUSTOMER)"},{"line_number":896,"context_line":"        token_resp \u003d r.result.get(\u0027token\u0027)"},{"line_number":897,"context_line":"        domain_id \u003d token_resp[\u0027domain\u0027][\u0027id\u0027]"},{"line_number":898,"context_line":"        self.assertEqual(domain_id, self.domainA[\u0027id\u0027])"},{"line_number":899,"context_line":"        self._checkScopedTokenAttributes(token_resp)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FxA%3D","line":896,"updated":"2014-02-22 18:51:36.000000000","message":"use [] rather than .get here.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":893,"context_line":"    def test_scope_to_domain_once(self):"},{"line_number":894,"context_line":"        r \u003d self.post(self.AUTH_URL,"},{"line_number":895,"context_line":"                      body\u003dself.TOKEN_SCOPE_DOMAIN_A_FROM_CUSTOMER)"},{"line_number":896,"context_line":"        token_resp \u003d r.result.get(\u0027token\u0027)"},{"line_number":897,"context_line":"        domain_id \u003d token_resp[\u0027domain\u0027][\u0027id\u0027]"},{"line_number":898,"context_line":"        self.assertEqual(domain_id, self.domainA[\u0027id\u0027])"},{"line_number":899,"context_line":"        self._checkScopedTokenAttributes(token_resp)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0UI%3D","line":896,"in_reply_to":"AAAAU3%2F%2F%2FxA%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":901,"context_line":"    def test_scope_to_domain_multiple_tokens(self):"},{"line_number":902,"context_line":"        \"\"\"Issue multiple tokens scoping to different domains."},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"        The new tokens should be scoped to:"},{"line_number":905,"context_line":"        * domainA"},{"line_number":906,"context_line":"        * domainB"},{"line_number":907,"context_line":"        * domainC"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fw8%3D","line":904,"updated":"2014-02-22 18:51:36.000000000","message":"add a blank line after this line for rst.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":901,"context_line":"    def test_scope_to_domain_multiple_tokens(self):"},{"line_number":902,"context_line":"        \"\"\"Issue multiple tokens scoping to different domains."},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"        The new tokens should be scoped to:"},{"line_number":905,"context_line":"        * domainA"},{"line_number":906,"context_line":"        * domainB"},{"line_number":907,"context_line":"        * domainC"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0To%3D","line":904,"in_reply_to":"AAAAU3%2F%2F%2Fw8%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        for body, domain_id_ref in zip(bodies, domain_ids):"},{"line_number":918,"context_line":"            r \u003d self.post(self.AUTH_URL, body\u003dbody)"},{"line_number":919,"context_line":"            token_resp \u003d r.result.get(\u0027token\u0027)"},{"line_number":920,"context_line":"            try:"},{"line_number":921,"context_line":"                domain_id \u003d token_resp[\u0027domain\u0027][\u0027id\u0027]"},{"line_number":922,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fw4%3D","line":919,"updated":"2014-02-22 18:51:36.000000000","message":"use [] here rather than .get","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        for body, domain_id_ref in zip(bodies, domain_ids):"},{"line_number":918,"context_line":"            r \u003d self.post(self.AUTH_URL, body\u003dbody)"},{"line_number":919,"context_line":"            token_resp \u003d r.result.get(\u0027token\u0027)"},{"line_number":920,"context_line":"            try:"},{"line_number":921,"context_line":"                domain_id \u003d token_resp[\u0027domain\u0027][\u0027id\u0027]"},{"line_number":922,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0Tg%3D","line":919,"in_reply_to":"AAAAU3%2F%2F%2Fw4%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":920,"context_line":"            try:"},{"line_number":921,"context_line":"                domain_id \u003d token_resp[\u0027domain\u0027][\u0027id\u0027]"},{"line_number":922,"context_line":"            except KeyError:"},{"line_number":923,"context_line":"                raise AssertionError(\"Either domain or domain\u0027s\""},{"line_number":924,"context_line":"                                     \"id are missing\")"},{"line_number":925,"context_line":"            self.assertEqual(domain_id, domain_id_ref)"},{"line_number":926,"context_line":"            self._checkScopedTokenAttributes(token_resp)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F9So%3D","line":923,"updated":"2014-02-23 14:37:20.000000000","message":"Are you doing this extra work to make the test failures nicer? Why not just let the KeyError propagate up?","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":920,"context_line":"            try:"},{"line_number":921,"context_line":"                domain_id \u003d token_resp[\u0027domain\u0027][\u0027id\u0027]"},{"line_number":922,"context_line":"            except KeyError:"},{"line_number":923,"context_line":"                raise AssertionError(\"Either domain or domain\u0027s\""},{"line_number":924,"context_line":"                                     \"id are missing\")"},{"line_number":925,"context_line":"            self.assertEqual(domain_id, domain_id_ref)"},{"line_number":926,"context_line":"            self._checkScopedTokenAttributes(token_resp)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0RI%3D","line":923,"in_reply_to":"AAAAU3%2F%2F9So%3D","updated":"2014-02-24 18:57:58.000000000","message":"yes, i was. except KeyError removed now.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":941,"context_line":""},{"line_number":942,"context_line":"        for token, projects_ref in zip(token, projects_refs):"},{"line_number":943,"context_line":"            r \u003d self.get(url, token\u003dtoken)"},{"line_number":944,"context_line":"            projects_resp \u003d r.result.get(\u0027projects\u0027)"},{"line_number":945,"context_line":"            projects \u003d set(p[\u0027id\u0027] for p in projects_resp)"},{"line_number":946,"context_line":"            self.assertEqual(projects, projects_ref)"},{"line_number":947,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fws%3D","line":944,"updated":"2014-02-22 18:51:36.000000000","message":"use [] here rather than .get","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":941,"context_line":""},{"line_number":942,"context_line":"        for token, projects_ref in zip(token, projects_refs):"},{"line_number":943,"context_line":"            r \u003d self.get(url, token\u003dtoken)"},{"line_number":944,"context_line":"            projects_resp \u003d r.result.get(\u0027projects\u0027)"},{"line_number":945,"context_line":"            projects \u003d set(p[\u0027id\u0027] for p in projects_resp)"},{"line_number":946,"context_line":"            self.assertEqual(projects, projects_ref)"},{"line_number":947,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0QM%3D","line":944,"in_reply_to":"AAAAU3%2F%2F%2Fws%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":961,"context_line":""},{"line_number":962,"context_line":"        for token, domains_ref in zip(tokens, domain_refs):"},{"line_number":963,"context_line":"            r \u003d self.get(url, token\u003dtoken)"},{"line_number":964,"context_line":"            domains_resp \u003d r.result.get(\u0027domains\u0027)"},{"line_number":965,"context_line":"            domains \u003d set(p[\u0027id\u0027] for p in domains_resp)"},{"line_number":966,"context_line":"            self.assertEqual(domains, domains_ref)"},{"line_number":967,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fwo%3D","line":964,"updated":"2014-02-22 18:51:36.000000000","message":"use [] here rather than .get","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":961,"context_line":""},{"line_number":962,"context_line":"        for token, domains_ref in zip(tokens, domain_refs):"},{"line_number":963,"context_line":"            r \u003d self.get(url, token\u003dtoken)"},{"line_number":964,"context_line":"            domains_resp \u003d r.result.get(\u0027domains\u0027)"},{"line_number":965,"context_line":"            domains \u003d set(p[\u0027id\u0027] for p in domains_resp)"},{"line_number":966,"context_line":"            self.assertEqual(domains, domains_ref)"},{"line_number":967,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0O4%3D","line":964,"in_reply_to":"AAAAU3%2F%2F%2Fwo%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":977,"context_line":"        employee_unscoped_token_id \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":978,"context_line":"        r \u003d self.get(\u0027/OS-FEDERATION/projects\u0027,"},{"line_number":979,"context_line":"                     token\u003demployee_unscoped_token_id)"},{"line_number":980,"context_line":"        projects \u003d r.result.get(\u0027projects\u0027)"},{"line_number":981,"context_line":"        random_project \u003d random.randint(0, len(projects)) - 1"},{"line_number":982,"context_line":"        project \u003d projects[random_project]"},{"line_number":983,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fwg%3D","line":980,"updated":"2014-02-22 18:51:36.000000000","message":"use [] here rather than .get()","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":977,"context_line":"        employee_unscoped_token_id \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":978,"context_line":"        r \u003d self.get(\u0027/OS-FEDERATION/projects\u0027,"},{"line_number":979,"context_line":"                     token\u003demployee_unscoped_token_id)"},{"line_number":980,"context_line":"        projects \u003d r.result.get(\u0027projects\u0027)"},{"line_number":981,"context_line":"        random_project \u003d random.randint(0, len(projects)) - 1"},{"line_number":982,"context_line":"        project \u003d projects[random_project]"},{"line_number":983,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0TQ%3D","line":980,"in_reply_to":"AAAAU3%2F%2F%2Fwg%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":985,"context_line":"                                               \u0027project\u0027, project[\u0027id\u0027])"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        r \u003d self.post(self.AUTH_URL, body\u003dv3_scope_request)"},{"line_number":988,"context_line":"        token_resp \u003d r.result.get(\u0027token\u0027)"},{"line_number":989,"context_line":"        try:"},{"line_number":990,"context_line":"            project_id \u003d token_resp[\u0027project\u0027][\u0027id\u0027]"},{"line_number":991,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fwk%3D","line":988,"updated":"2014-02-22 18:51:36.000000000","message":"use [] here rather than .get()","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":985,"context_line":"                                               \u0027project\u0027, project[\u0027id\u0027])"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        r \u003d self.post(self.AUTH_URL, body\u003dv3_scope_request)"},{"line_number":988,"context_line":"        token_resp \u003d r.result.get(\u0027token\u0027)"},{"line_number":989,"context_line":"        try:"},{"line_number":990,"context_line":"            project_id \u003d token_resp[\u0027project\u0027][\u0027id\u0027]"},{"line_number":991,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0Sg%3D","line":988,"in_reply_to":"AAAAU3%2F%2F%2Fwk%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":1118,"context_line":"                                         group_id\u003dself.group_admins[\u0027id\u0027],"},{"line_number":1119,"context_line":"                                         domain_id\u003dself.domainC[\u0027id\u0027])"},{"line_number":1120,"context_line":"        self.rules \u003d {"},{"line_number":1121,"context_line":"            \"rules\": ["},{"line_number":1122,"context_line":"                {"},{"line_number":1123,"context_line":"                    \"local\": ["},{"line_number":1124,"context_line":"                        {"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FwY%3D","line":1121,"updated":"2014-02-22 18:51:36.000000000","message":"use \u0027 for strings consistently.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":1118,"context_line":"                                         group_id\u003dself.group_admins[\u0027id\u0027],"},{"line_number":1119,"context_line":"                                         domain_id\u003dself.domainC[\u0027id\u0027])"},{"line_number":1120,"context_line":"        self.rules \u003d {"},{"line_number":1121,"context_line":"            \"rules\": ["},{"line_number":1122,"context_line":"                {"},{"line_number":1123,"context_line":"                    \"local\": ["},{"line_number":1124,"context_line":"                        {"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0OI%3D","line":1121,"in_reply_to":"AAAAU3%2F%2F%2FwY%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import random"},{"line_number":14,"context_line":"import urllib"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from keystone.auth import controllers as auth_controllers"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fubc%3D","line":14,"updated":"2014-02-25 03:54:24.000000000","message":"changed to use six here","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        super(FederationTests, self).setup_database()"},{"line_number":45,"context_line":"        package_name \u003d \u0027.\u0027.join((contrib.__name__, self.EXTENSION_NAME))"},{"line_number":46,"context_line":"        package \u003d importutils.import_module(package_name)"},{"line_number":47,"context_line":"        migration.db_version_control(package\u003dpackage)"},{"line_number":48,"context_line":"        migration.db_sync(package\u003dpackage)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FvmY%3D","line":47,"updated":"2014-02-25 00:44:41.000000000","message":"why is this changing?","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        super(FederationTests, self).setup_database()"},{"line_number":45,"context_line":"        package_name \u003d \u0027.\u0027.join((contrib.__name__, self.EXTENSION_NAME))"},{"line_number":46,"context_line":"        package \u003d importutils.import_module(package_name)"},{"line_number":47,"context_line":"        migration.db_version_control(package\u003dpackage)"},{"line_number":48,"context_line":"        migration.db_sync(package\u003dpackage)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fucw%3D","line":47,"in_reply_to":"AAAAU3%2F%2FvmY%3D","updated":"2014-02-25 03:54:24.000000000","message":"reverted","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":787,"context_line":"    def _roles(self, roles):"},{"line_number":788,"context_line":"        return set([(r[\u0027id\u0027], r[\u0027name\u0027]) for r in roles])"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def _checkProjectsAndRoles(self, token, roles, projects):"},{"line_number":791,"context_line":"        \"\"\"Check whether the projects and the roles match.\"\"\""},{"line_number":792,"context_line":"        token_roles \u003d token.get(\u0027roles\u0027)"},{"line_number":793,"context_line":"        if token_roles is None:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv1c%3D","line":790,"updated":"2014-02-25 00:44:41.000000000","message":"use the normal naming for methods -- _check_proects_and_roles()","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":787,"context_line":"    def _roles(self, roles):"},{"line_number":788,"context_line":"        return set([(r[\u0027id\u0027], r[\u0027name\u0027]) for r in roles])"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def _checkProjectsAndRoles(self, token, roles, projects):"},{"line_number":791,"context_line":"        \"\"\"Check whether the projects and the roles match.\"\"\""},{"line_number":792,"context_line":"        token_roles \u003d token.get(\u0027roles\u0027)"},{"line_number":793,"context_line":"        if token_roles is None:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FucM%3D","line":790,"in_reply_to":"AAAAU3%2F%2Fv1c%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        \"\"\"Check whether the projects and the roles match.\"\"\""},{"line_number":792,"context_line":"        token_roles \u003d token.get(\u0027roles\u0027)"},{"line_number":793,"context_line":"        if token_roles is None:"},{"line_number":794,"context_line":"            raise AssertionError(_(\u0027Roles not found in the token\u0027))"},{"line_number":795,"context_line":"        token_roles \u003d self._roles(token_roles)"},{"line_number":796,"context_line":"        roles_ref \u003d self._roles(roles)"},{"line_number":797,"context_line":"        self.assertEqual(token_roles, roles_ref)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv1Q%3D","line":794,"updated":"2014-02-25 00:44:41.000000000","message":"remove _() from these strings. We don\u0027t need to translate test results. This applies throughout this file","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        \"\"\"Check whether the projects and the roles match.\"\"\""},{"line_number":792,"context_line":"        token_roles \u003d token.get(\u0027roles\u0027)"},{"line_number":793,"context_line":"        if token_roles is None:"},{"line_number":794,"context_line":"            raise AssertionError(_(\u0027Roles not found in the token\u0027))"},{"line_number":795,"context_line":"        token_roles \u003d self._roles(token_roles)"},{"line_number":796,"context_line":"        roles_ref \u003d self._roles(roles)"},{"line_number":797,"context_line":"        self.assertEqual(token_roles, roles_ref)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2FucI%3D","line":794,"in_reply_to":"AAAAU3%2F%2Fv1Q%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":847,"context_line":"    def test_scope_to_project_multiple_times(self):"},{"line_number":848,"context_line":"        \"\"\"Try to scope the unscoped token multiple times."},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"        The new tokens should be scoped to:"},{"line_number":851,"context_line":"        * Customers\u0027 project"},{"line_number":852,"context_line":"        * Employees\u0027 project"},{"line_number":853,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fv0c%3D","line":850,"updated":"2014-02-25 00:44:41.000000000","message":"add a blank line after this line for rst.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":847,"context_line":"    def test_scope_to_project_multiple_times(self):"},{"line_number":848,"context_line":"        \"\"\"Try to scope the unscoped token multiple times."},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"        The new tokens should be scoped to:"},{"line_number":851,"context_line":"        * Customers\u0027 project"},{"line_number":852,"context_line":"        * Employees\u0027 project"},{"line_number":853,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fub4%3D","line":850,"in_reply_to":"AAAAU3%2F%2Fv0c%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1952e55f192037f0d3cfdde2486c6d60700de05a","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        }"},{"line_number":760,"context_line":"        return proto"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"    def mapping_ref(self, rules\u003d{}):"},{"line_number":763,"context_line":"        return {"},{"line_number":764,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":765,"context_line":"            \u0027rules\u0027: rules"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2FuIA%3D","line":762,"updated":"2014-02-25 04:04:00.000000000","message":"can remove this one, and hopefully remove the other two above.","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"31609b46d9767f0bd51e6dde8ebf936e31c7d600","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        }"},{"line_number":760,"context_line":"        return proto"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"    def mapping_ref(self, rules\u003d{}):"},{"line_number":763,"context_line":"        return {"},{"line_number":764,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":765,"context_line":"            \u0027rules\u0027: rules"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2Fnb0%3D","line":762,"in_reply_to":"AAAAU3%2F%2FuIA%3D","updated":"2014-02-25 16:51:46.000000000","message":"changed this function so it produced more appropriate objects.","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1952e55f192037f0d3cfdde2486c6d60700de05a","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"        self.federation_api.create_idp(self.idp[\u0027id\u0027],"},{"line_number":1201,"context_line":"                                       self.idp)"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"        # Add a mapping"},{"line_number":1204,"context_line":"        mapping_id \u003d uuid.uuid4().hex"},{"line_number":1205,"context_line":"        url \u003d \u0027/OS-FEDERATION/mappings/\u0027 + mapping_id"},{"line_number":1206,"context_line":"        resp \u003d self.put(url, body\u003d{\u0027mapping\u0027: self.rules},"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2FuH0%3D","line":1203,"updated":"2014-02-25 04:04:00.000000000","message":"I changed this to actually make a REST call, instead of interacting directly with the api.","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"31609b46d9767f0bd51e6dde8ebf936e31c7d600","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"        self.federation_api.create_idp(self.idp[\u0027id\u0027],"},{"line_number":1201,"context_line":"                                       self.idp)"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"        # Add a mapping"},{"line_number":1204,"context_line":"        mapping_id \u003d uuid.uuid4().hex"},{"line_number":1205,"context_line":"        url \u003d \u0027/OS-FEDERATION/mappings/\u0027 + mapping_id"},{"line_number":1206,"context_line":"        resp \u003d self.put(url, body\u003d{\u0027mapping\u0027: self.rules},"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAU3%2F%2Fnbk%3D","line":1203,"in_reply_to":"AAAAU3%2F%2FuH0%3D","updated":"2014-02-25 16:51:46.000000000","message":"reverted so it\u0027s more consistent with the idp/protocol create operations.","commit_id":"e178785cba6d405d82d0f8532a89dfacc9237252"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9b257f39131ba3125f0e9b29efea63bb7ad31260","unresolved":false,"context_lines":[{"line_number":708,"context_line":"        assertion \u003d mapping_fixtures.TESTER_ASSERTION"},{"line_number":709,"context_line":"        rp \u003d mapping_utils.RuleProcessor(mapping[\u0027rules\u0027])"},{"line_number":710,"context_line":"        values \u003d rp.process(assertion)"},{"line_number":711,"context_line":"        user_name \u003d mapping_fixtures.TESTER_ASSERTION.get(\u0027UserName\u0027)"},{"line_number":712,"context_line":"        group_ids \u003d values.get(\u0027group_ids\u0027)"},{"line_number":713,"context_line":"        name \u003d values.get(\u0027name\u0027)"},{"line_number":714,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAU3%2F%2Fnak%3D","line":711,"updated":"2014-02-25 16:54:08.000000000","message":"user_name \u003d assertion.get(\u0027UserName\u0027), goes the tests above too","commit_id":"59a08af7f2ccdd33d627abfa031d3e5cc26a8971"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b35474790d327792a19449aad3d44b69b59d3ae0","unresolved":false,"context_lines":[{"line_number":708,"context_line":"        assertion \u003d mapping_fixtures.TESTER_ASSERTION"},{"line_number":709,"context_line":"        rp \u003d mapping_utils.RuleProcessor(mapping[\u0027rules\u0027])"},{"line_number":710,"context_line":"        values \u003d rp.process(assertion)"},{"line_number":711,"context_line":"        user_name \u003d mapping_fixtures.TESTER_ASSERTION.get(\u0027UserName\u0027)"},{"line_number":712,"context_line":"        group_ids \u003d values.get(\u0027group_ids\u0027)"},{"line_number":713,"context_line":"        name \u003d values.get(\u0027name\u0027)"},{"line_number":714,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAU3%2F%2FnOw%3D","line":711,"in_reply_to":"AAAAU3%2F%2Fnak%3D","updated":"2014-02-25 17:13:15.000000000","message":"Done","commit_id":"59a08af7f2ccdd33d627abfa031d3e5cc26a8971"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9b257f39131ba3125f0e9b29efea63bb7ad31260","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"                                       self.idp)"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":"#        # Add a mapping"},{"line_number":1202,"context_line":"#        mapping_id \u003d uuid.uuid4().hex"},{"line_number":1203,"context_line":"#        url \u003d \u0027/OS-FEDERATION/mappings/\u0027 + mapping_id"},{"line_number":1204,"context_line":"#        resp \u003d self.put(url, body\u003d{\u0027mapping\u0027: self.rules},"},{"line_number":1205,"context_line":"#                        expected_status\u003d201)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAU3%2F%2FnZo%3D","line":1202,"updated":"2014-02-25 16:54:08.000000000","message":"remove commented out code","commit_id":"59a08af7f2ccdd33d627abfa031d3e5cc26a8971"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b35474790d327792a19449aad3d44b69b59d3ae0","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"                                       self.idp)"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":"#        # Add a mapping"},{"line_number":1202,"context_line":"#        mapping_id \u003d uuid.uuid4().hex"},{"line_number":1203,"context_line":"#        url \u003d \u0027/OS-FEDERATION/mappings/\u0027 + mapping_id"},{"line_number":1204,"context_line":"#        resp \u003d self.put(url, body\u003d{\u0027mapping\u0027: self.rules},"},{"line_number":1205,"context_line":"#                        expected_status\u003d201)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAU3%2F%2FnOk%3D","line":1202,"in_reply_to":"AAAAU3%2F%2FnZo%3D","updated":"2014-02-25 17:13:15.000000000","message":"Done","commit_id":"59a08af7f2ccdd33d627abfa031d3e5cc26a8971"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bc7d4bb85abb9369a6ce7dea875f3ddba5a83821","unresolved":false,"context_lines":[{"line_number":723,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":724,"context_line":"    AUTH_METHOD \u003d \u0027saml2\u0027"},{"line_number":725,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":726,"context_line":"    ENC_USER \u003d parse.quote(USER)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"},{"line_number":729,"context_line":"        \"identity\": {"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAU3%2F%2FlEw%3D","line":726,"updated":"2014-02-25 20:39:27.000000000","message":"this is not used","commit_id":"9f17c8955fec7d1c146d05e9f4cee206f28f9377"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":603,"context_line":"        values \u003d rp.process(assertion)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        fn \u003d assertion.get(\u0027FirstName\u0027)"},{"line_number":606,"context_line":"        ln \u003d assertion.get(\u0027LastName\u0027)"},{"line_number":607,"context_line":"        full_name \u003d \u0027%s %s\u0027 % (fn, ln)"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"        group_ids \u003d values.get(\u0027group_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FBs%3D","line":606,"updated":"2014-02-27 00:59:19.000000000","message":"nice! wish it was done in a separate commit since it\u0027s unrelated.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        This will not match since the email in the assertion will fail"},{"line_number":619,"context_line":"        the regex test. It is set to match any @example.com address."},{"line_number":620,"context_line":"        But the incoming value is set to eviltester@example.org."},{"line_number":621,"context_line":"        Server should return HTTP 401 Unauthorized status code."},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        \"\"\""},{"line_number":624,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FBM%3D","line":621,"updated":"2014-02-27 00:59:19.000000000","message":"This doesn\u0027t test what the server returns since there\u0027s no server involved. The rule processor raises the exception.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        This will not match since the email in the assertion will fail"},{"line_number":619,"context_line":"        the regex test. It is set to match any @example.com address."},{"line_number":620,"context_line":"        But the incoming value is set to eviltester@example.org."},{"line_number":621,"context_line":"        Server should return HTTP 401 Unauthorized status code."},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        \"\"\""},{"line_number":624,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Us%3D","line":621,"in_reply_to":"AAAAVX%2F%2F%2FBM%3D","updated":"2014-02-27 13:17:45.000000000","message":"right, changing the docstring!","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}],"keystone/token/providers/common.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f07db3347e7c07925bc419119a150bb253a9944a","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                \u0027trust_id\u0027 in metadata_ref):"},{"line_number":425,"context_line":"            trust \u003d self.trust_api.get_trust(metadata_ref[\u0027trust_id\u0027])"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        if \u0027federation\u0027 in method_names:"},{"line_number":428,"context_line":"            t \u003d self.scoped_federation_token(auth_context[\u0027user_id\u0027],"},{"line_number":429,"context_line":"                                             auth_context[\u0027federated_token\u0027],"},{"line_number":430,"context_line":"                                             method_names,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIuM%3D","line":427,"updated":"2014-02-16 13:47:27.000000000","message":"nice hack.","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f07db3347e7c07925bc419119a150bb253a9944a","unresolved":false,"context_lines":[{"line_number":557,"context_line":"            token_data, expires\u003dexpires_at, trust\u003dNone)"},{"line_number":558,"context_line":"        token_kwargs \u003d {"},{"line_number":559,"context_line":"            \u0027user_id\u0027: None,"},{"line_number":560,"context_line":"            \u0027method_names\u0027: [\u0027federated\u0027],"},{"line_number":561,"context_line":"            \u0027extras\u0027: None,"},{"line_number":562,"context_line":"            \u0027domain_id\u0027: domain_id,"},{"line_number":563,"context_line":"            \u0027project_id\u0027: project_id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIvc%3D","line":560,"updated":"2014-02-16 13:47:27.000000000","message":"renamed to \u0027federation\u0027","commit_id":"a2ed0cd9c510d02fc7ce8ae96542bfcfb5ef866f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1dd72a8bd565b8ed053fe9740844b248ec0a3b07","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                \u0027trust_id\u0027 in metadata_ref):"},{"line_number":425,"context_line":"            trust \u003d self.trust_api.get_trust(metadata_ref[\u0027trust_id\u0027])"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        if \u0027federation\u0027 in method_names:"},{"line_number":428,"context_line":"            t \u003d self.scoped_federation_token(auth_context[\u0027user_id\u0027],"},{"line_number":429,"context_line":"                                             auth_context[\u0027federated_token\u0027],"},{"line_number":430,"context_line":"                                             method_names,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FG6g%3D","line":427,"updated":"2014-02-17 03:53:42.000000000","message":"\u0027SAML\u0027","commit_id":"4936e264fffea338bd79b5106093d4b99b60b9e2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1dd72a8bd565b8ed053fe9740844b248ec0a3b07","unresolved":false,"context_lines":[{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        return (token_id, token_data)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def unscoped_federation_token(self, token_data):"},{"line_number":496,"context_line":"        \"\"\"Return unscoped token for federated authentication."},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        :param token: prepared token dictionary with a \u0027user\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FG6Y%3D","line":495,"updated":"2014-02-17 03:53:42.000000000","message":"Why is an unscoped federation token any different from any other  Unscoped token","commit_id":"4936e264fffea338bd79b5106093d4b99b60b9e2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1dd72a8bd565b8ed053fe9740844b248ec0a3b07","unresolved":false,"context_lines":[{"line_number":577,"context_line":"            self.token_api.create_token(token_id, data)"},{"line_number":578,"context_line":"        except Exception:"},{"line_number":579,"context_line":"            exc_info \u003d sys.exc_info()"},{"line_number":580,"context_line":"            # An identical token may have been created already."},{"line_number":581,"context_line":"            # If so, return the token_data as it is also identical"},{"line_number":582,"context_line":"            try:"},{"line_number":583,"context_line":"                self.token_api.get_token(token_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FG6I%3D","line":580,"updated":"2014-02-17 03:53:42.000000000","message":"They should have a different issued_at time, and thus get a different id.","commit_id":"4936e264fffea338bd79b5106093d4b99b60b9e2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3157bd022cf5309d5dc2bfae6b0b62ea9a14ba25","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from keystone.openstack.common import log"},{"line_number":29,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":30,"context_line":"import urllib"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d log.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUX%2F%2B8Bo%3D","line":30,"updated":"2014-02-18 04:22:10.000000000","message":"same comment here","commit_id":"c328c1ab0821ae108010799a0a6227c8a9627cf8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3157bd022cf5309d5dc2bfae6b0b62ea9a14ba25","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        kwargs \u003d {"},{"line_number":194,"context_line":"                  \u0027project_id\u0027: project_id,"},{"line_number":195,"context_line":"                  \u0027domain_id\u0027: domain_id"},{"line_number":196,"context_line":"                  }"},{"line_number":197,"context_line":"        roles \u003d self.assignment_api.get_roles_for_groups(group_ids,"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUX%2F%2B8Bc%3D","line":194,"updated":"2014-02-18 04:22:10.000000000","message":"Keep this on the line above, it\u0027s failing pep8: \n\n    kwargs \u003d {\u0027project_id\u0027: project_id,\n              \u0027domain_id\u0027: domain_id}","commit_id":"c328c1ab0821ae108010799a0a6227c8a9627cf8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f11578b2468fe7f38217a972c4bb1dfe595daf6d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone.token import provider"},{"line_number":25,"context_line":"from keystone import trust"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from keystone.openstack.common import log"},{"line_number":29,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtPo%3D","side":"PARENT","line":27,"updated":"2014-02-19 17:13:14.000000000","message":"Unrelated whitespace change?","commit_id":"2a93236510a6ba6bcb1ebbb88b45254dba267508"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f11578b2468fe7f38217a972c4bb1dfe595daf6d","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                                               project_id, domain_id,"},{"line_number":425,"context_line":"                                               auth_context, metadata_ref)"},{"line_number":426,"context_line":"            return t"},{"line_number":427,"context_line":"        elif \u0027saml2\u0027 in method_names:"},{"line_number":428,"context_line":"            t \u003d self.scoped_federation_token(auth_context[\u0027user_id\u0027],"},{"line_number":429,"context_line":"                                             auth_context[\u0027federated_token\u0027],"},{"line_number":430,"context_line":"                                             method_names, expires_at,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtN4%3D","line":427,"updated":"2014-02-19 17:13:14.000000000","message":"This is essentially the same check as on line 420. I suppose this could be done with a nest if statement. \n\n    if \u0027saml2\u0027 in method_names:\n        if not project_id:\n            # do stuff here (lines 421 - 425)\n        else:\n            # do other stuff here (lines 428 - 432)\n        return t","commit_id":"e0bf9f535f584c87f07512d07258caaa83d9e1b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cbd96483e24080e98ba0bc6146b31af07148281d","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                                               project_id, domain_id,"},{"line_number":425,"context_line":"                                               auth_context, metadata_ref)"},{"line_number":426,"context_line":"            return t"},{"line_number":427,"context_line":"        elif \u0027saml2\u0027 in method_names:"},{"line_number":428,"context_line":"            t \u003d self.scoped_federation_token(auth_context[\u0027user_id\u0027],"},{"line_number":429,"context_line":"                                             auth_context[\u0027federated_token\u0027],"},{"line_number":430,"context_line":"                                             method_names, expires_at,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtII%3D","line":427,"in_reply_to":"AAAAUX%2F%2BtN4%3D","updated":"2014-02-19 17:25:06.000000000","message":"++ that is much better, thanks","commit_id":"e0bf9f535f584c87f07512d07258caaa83d9e1b7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f11578b2468fe7f38217a972c4bb1dfe595daf6d","unresolved":false,"context_lines":[{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def unscoped_federation_token(self, user_id, groups, method_names,"},{"line_number":496,"context_line":"                                  expires_at, project_id, domain_id,"},{"line_number":497,"context_line":"                                  auth_context, metadata_ref):"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        token_data \u003d {"},{"line_number":500,"context_line":"            \u0027user\u0027: {"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtNI%3D","line":497,"updated":"2014-02-19 17:13:14.000000000","message":"Docstrings","commit_id":"e0bf9f535f584c87f07512d07258caaa83d9e1b7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f11578b2468fe7f38217a972c4bb1dfe595daf6d","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def scoped_federation_token(self, user_id, federated_token, method_names,"},{"line_number":547,"context_line":"                                expires_at, project_id, domain_id,"},{"line_number":548,"context_line":"                                auth_context, metadata_ref):"},{"line_number":549,"context_line":"        token_data \u003d {"},{"line_number":550,"context_line":"            \u0027user\u0027: federated_token[\u0027user\u0027],"},{"line_number":551,"context_line":"            \u0027methods\u0027: method_names,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtNE%3D","line":548,"updated":"2014-02-19 17:13:14.000000000","message":"docstrings","commit_id":"e0bf9f535f584c87f07512d07258caaa83d9e1b7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f11578b2468fe7f38217a972c4bb1dfe595daf6d","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            \u0027token\u0027: token_data,"},{"line_number":566,"context_line":"            \u0027include_catalog\u0027: True,"},{"line_number":567,"context_line":"            \u0027bind\u0027: None"},{"line_number":568,"context_line":"        }"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"        token_data \u003d self.v3_token_data_helper.get_token_data("},{"line_number":571,"context_line":"            **token_kwargs)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtMg%3D","line":568,"updated":"2014-02-19 17:13:14.000000000","message":"quite a bit of similar code between scoped_federation_token and unscoped_federation_token. Wonder if we could consolidate the two methods a little.","commit_id":"e0bf9f535f584c87f07512d07258caaa83d9e1b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cbd96483e24080e98ba0bc6146b31af07148281d","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            \u0027token\u0027: token_data,"},{"line_number":566,"context_line":"            \u0027include_catalog\u0027: True,"},{"line_number":567,"context_line":"            \u0027bind\u0027: None"},{"line_number":568,"context_line":"        }"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"        token_data \u003d self.v3_token_data_helper.get_token_data("},{"line_number":571,"context_line":"            **token_kwargs)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2BtHg%3D","line":568,"in_reply_to":"AAAAUX%2F%2BtMg%3D","updated":"2014-02-19 17:25:06.000000000","message":"could probably consolidate lines 570-586","commit_id":"e0bf9f535f584c87f07512d07258caaa83d9e1b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b2e5fd37732575f21e1dbf974c7df7cdcdc263b","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                \u0027trust_id\u0027 in metadata_ref):"},{"line_number":418,"context_line":"            trust \u003d self.trust_api.get_trust(metadata_ref[\u0027trust_id\u0027])"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        if \u0027saml2\u0027 in method_names and not project_id:"},{"line_number":421,"context_line":"            t \u003d self.unscoped_federation_token(auth_context[\u0027user_id\u0027],"},{"line_number":422,"context_line":"                                               auth_context[\u0027group_ids\u0027],"},{"line_number":423,"context_line":"                                               method_names, expires_at,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqMM%3D","line":420,"updated":"2014-02-19 23:25:02.000000000","message":"I implemented lances suggestion here","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3b2e5fd37732575f21e1dbf974c7df7cdcdc263b","unresolved":false,"context_lines":[{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        return (token_id, token_data)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def unscoped_federation_token(self, user_id, groups, method_names,"},{"line_number":496,"context_line":"                                  expires_at, project_id, domain_id,"},{"line_number":497,"context_line":"                                  auth_context, metadata_ref):"},{"line_number":498,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAUX%2F%2BqMA%3D","line":495,"updated":"2014-02-19 23:25:02.000000000","message":"i refactored this heavily, to just return token_data, from that point, we can just piggy back off the existing issue_v3_token code.","commit_id":"52878f50ba9ae626fcd96c1b49a75491b065db05"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1acbab88f3e9816baa36fc069998a3f48a7162ee","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone import token"},{"line_number":24,"context_line":"from keystone.token import provider"},{"line_number":25,"context_line":"from keystone import trust"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from keystone.openstack.common import log"},{"line_number":29,"context_line":"from keystone.openstack.common import timeutils"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAUX%2F%2BgOo%3D","side":"PARENT","line":26,"updated":"2014-02-20 20:23:51.000000000","message":"Unrelated whitespace change?","commit_id":"9fbb60dbe0df5bf5d49aeb07ad165fc9f11b0947"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fc8b5b9b99623fc526364588b9c2e4f19c6f2d8","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"import urllib"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F9Ts%3D","line":17,"updated":"2014-02-23 14:37:20.000000000","message":"Let\u0027s make this Python3 friendly using something like:\n\n  from six.moves.urllib import parse\n  parse.quote()","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"import urllib"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0IE%3D","line":17,"in_reply_to":"AAAAU3%2F%2F9Ts%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone import token"},{"line_number":25,"context_line":"from keystone.token import provider"},{"line_number":26,"context_line":"from keystone import trust"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from keystone.openstack.common import log"},{"line_number":29,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FwQ%3D","line":27,"updated":"2014-02-22 18:51:36.000000000","message":"revert whitespace change on previous line.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone import token"},{"line_number":25,"context_line":"from keystone.token import provider"},{"line_number":26,"context_line":"from keystone import trust"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from keystone.openstack.common import log"},{"line_number":29,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0H0%3D","line":27,"in_reply_to":"AAAAU3%2F%2F%2FwQ%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                            \u0027user_id\u0027: user_id,"},{"line_number":187,"context_line":"                            \u0027domain_id\u0027: domain_id}"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            LOG.debug(msg)"},{"line_number":190,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        roles \u003d self.assignment_api.get_roles_for_groups(group_ids,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fv8%3D","line":189,"updated":"2014-02-22 18:51:36.000000000","message":"the an exception with the message will be raised. Seems like we don\u0027t need to also log it. Let the caller deal with it.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                            \u0027user_id\u0027: user_id,"},{"line_number":187,"context_line":"                            \u0027domain_id\u0027: domain_id}"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            LOG.debug(msg)"},{"line_number":190,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        roles \u003d self.assignment_api.get_roles_for_groups(group_ids,"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0Hg%3D","line":189,"in_reply_to":"AAAAU3%2F%2F%2Fv8%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                                                         project_id,"},{"line_number":194,"context_line":"                                                         domain_id)"},{"line_number":195,"context_line":"        _check_roles(roles, user_id, project_id, domain_id)"},{"line_number":196,"context_line":"        token_data[\u0027roles\u0027] \u003d roles"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def _populate_user(self, token_data, user_id, trust):"},{"line_number":199,"context_line":"        if \u0027user\u0027 in token_data:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2FvQ%3D","line":196,"updated":"2014-02-22 18:51:36.000000000","message":"have this function just return the roles rather than use an in-out parameter.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                                                         project_id,"},{"line_number":194,"context_line":"                                                         domain_id)"},{"line_number":195,"context_line":"        _check_roles(roles, user_id, project_id, domain_id)"},{"line_number":196,"context_line":"        token_data[\u0027roles\u0027] \u003d roles"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def _populate_user(self, token_data, user_id, trust):"},{"line_number":199,"context_line":"        if \u0027user\u0027 in token_data:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F0BE%3D","line":196,"in_reply_to":"AAAAU3%2F%2F%2FvQ%3D","updated":"2014-02-24 18:57:58.000000000","message":"I can easily change it, but I was actually trying to follow the convention from other similar functions - _populate_roles(), _populate_user(), _populate_scope() etc.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ccaec1fa4a8f943541fe5f18cd1f202ee2f43f00","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        return (token_id, token_data)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    def _handle_saml2_tokens(self, auth_context, method_names,"},{"line_number":487,"context_line":"                             project_id, domain_id):"},{"line_number":488,"context_line":"        if project_id or domain_id:"},{"line_number":489,"context_line":"            user_id \u003d auth_context[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2F%2Fvg%3D","line":486,"updated":"2014-02-22 18:51:36.000000000","message":"the method_names parameter isn\u0027t used so remove it.","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"303fbd2dacc27ec99957ad23ed492b99c13f6d3a","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        return (token_id, token_data)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    def _handle_saml2_tokens(self, auth_context, method_names,"},{"line_number":487,"context_line":"                             project_id, domain_id):"},{"line_number":488,"context_line":"        if project_id or domain_id:"},{"line_number":489,"context_line":"            user_id \u003d auth_context[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAU3%2F%2Fz%2Fw%3D","line":486,"in_reply_to":"AAAAU3%2F%2F%2Fvg%3D","updated":"2014-02-24 18:57:58.000000000","message":"Done","commit_id":"4f22661107a15a56f67e3cb0df45c10611f80725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa7b6a2bfe6bd9f4663d22323df8a627f5835211","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                                                         project_id,"},{"line_number":193,"context_line":"                                                         domain_id)"},{"line_number":194,"context_line":"        _check_roles(roles, user_id, project_id, domain_id)"},{"line_number":195,"context_line":"        token_data[\u0027roles\u0027] \u003d roles"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def _populate_user(self, token_data, user_id, trust):"},{"line_number":198,"context_line":"        if \u0027user\u0027 in token_data:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fvzs%3D","line":195,"updated":"2014-02-25 00:44:41.000000000","message":"have this function just return the roles rather than use an in-out parameter -- I think those other methods are flawed, too.","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bd6713da7f54976bc085b51e1986b597a219c675","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                                                         project_id,"},{"line_number":193,"context_line":"                                                         domain_id)"},{"line_number":194,"context_line":"        _check_roles(roles, user_id, project_id, domain_id)"},{"line_number":195,"context_line":"        token_data[\u0027roles\u0027] \u003d roles"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def _populate_user(self, token_data, user_id, trust):"},{"line_number":198,"context_line":"        if \u0027user\u0027 in token_data:"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAU3%2F%2Fudc%3D","line":195,"in_reply_to":"AAAAU3%2F%2Fvzs%3D","updated":"2014-02-25 03:54:24.000000000","message":"Done","commit_id":"54dc4ed51d7f29c69824adf9fb79af7addb432e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bc7d4bb85abb9369a6ce7dea875f3ddba5a83821","unresolved":false,"context_lines":[{"line_number":499,"context_line":"            protocol \u003d auth_context[\u0027OS-FEDERATION:protocol\u0027]"},{"line_number":500,"context_line":"            token_data[\u0027user\u0027].update({"},{"line_number":501,"context_line":"                \u0027OS-FEDERATION\u0027: {"},{"line_number":502,"context_line":"                    \u0027identity_provider\u0027: idp,"},{"line_number":503,"context_line":"                    \u0027protocol\u0027: protocol"},{"line_number":504,"context_line":"                },"},{"line_number":505,"context_line":"                \u0027OS-FEDERATION:groups\u0027: [{\u0027id\u0027: x} for x in group_ids]"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAU3%2F%2FlHQ%3D","line":502,"updated":"2014-02-25 20:39:27.000000000","message":"should have an \u0027id\u0027 section to comply with the api spec, same with line 503","commit_id":"9f17c8955fec7d1c146d05e9f4cee206f28f9377"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import six"},{"line_number":17,"context_line":"from six.moves.urllib import parse"},{"line_number":18,"context_line":"import sys"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.common import dependency"},{"line_number":21,"context_line":"from keystone import config"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FA0%3D","line":18,"updated":"2014-02-27 00:59:19.000000000","message":"sys is a standard library so this should be up with the json import.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import six"},{"line_number":17,"context_line":"from six.moves.urllib import parse"},{"line_number":18,"context_line":"import sys"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.common import dependency"},{"line_number":21,"context_line":"from keystone import config"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Nw%3D","line":18,"in_reply_to":"AAAAVX%2F%2F%2FA0%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone import token"},{"line_number":24,"context_line":"from keystone.token import provider"},{"line_number":25,"context_line":"from keystone import trust"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from keystone.openstack.common import log"},{"line_number":28,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FAc%3D","line":26,"updated":"2014-02-27 00:59:19.000000000","message":"revert unrelated whitespace change on previous line.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone import token"},{"line_number":24,"context_line":"from keystone.token import provider"},{"line_number":25,"context_line":"from keystone import trust"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from keystone.openstack.common import log"},{"line_number":28,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7OE%3D","line":26,"in_reply_to":"AAAAVX%2F%2F%2FAc%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                   project_id\u003dNone, domain_id\u003dNone,"},{"line_number":173,"context_line":"                                   user_id\u003dNone):"},{"line_number":174,"context_line":"        def _check_roles(roles, user_id, project_id, domain_id):"},{"line_number":175,"context_line":"            if roles:"},{"line_number":176,"context_line":"                return"},{"line_number":177,"context_line":"            if project_id:"},{"line_number":178,"context_line":"                msg \u003d _(\u0027User %(user_id)s has no access \u0027"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2FAQ%3D","line":175,"updated":"2014-02-27 00:59:19.000000000","message":"add a comment why should return here.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                   project_id\u003dNone, domain_id\u003dNone,"},{"line_number":173,"context_line":"                                   user_id\u003dNone):"},{"line_number":174,"context_line":"        def _check_roles(roles, user_id, project_id, domain_id):"},{"line_number":175,"context_line":"            if roles:"},{"line_number":176,"context_line":"                return"},{"line_number":177,"context_line":"            if project_id:"},{"line_number":178,"context_line":"                msg \u003d _(\u0027User %(user_id)s has no access \u0027"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7Ls%3D","line":175,"in_reply_to":"AAAAVX%2F%2F%2FAQ%3D","updated":"2014-02-27 13:17:45.000000000","message":"Done","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2d34fe6cb9a4fcd05afd0363f419a37d237e1817","unresolved":false,"context_lines":[{"line_number":415,"context_line":"            trust \u003d self.trust_api.get_trust(metadata_ref[\u0027trust_id\u0027])"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        token_ref \u003d None"},{"line_number":418,"context_line":"        if \u0027saml2\u0027 in method_names:"},{"line_number":419,"context_line":"            token_ref \u003d self._handle_saml2_tokens(auth_context, project_id,"},{"line_number":420,"context_line":"                                                  domain_id)"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F%2B%2FU%3D","line":418,"updated":"2014-02-27 00:59:19.000000000","message":"can we use \"\u0027OS-FEDERATION:identity_provider\u0027 in auth_context\" here to check if using federation rather than checking for explicit method name?\n\nCan auth_context be None here (it defaults to None at line 410...), but that would fail all over the place.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f244853c5cf9b8e2b774f5c0f62168538365ee3b","unresolved":false,"context_lines":[{"line_number":415,"context_line":"            trust \u003d self.trust_api.get_trust(metadata_ref[\u0027trust_id\u0027])"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        token_ref \u003d None"},{"line_number":418,"context_line":"        if \u0027saml2\u0027 in method_names:"},{"line_number":419,"context_line":"            token_ref \u003d self._handle_saml2_tokens(auth_context, project_id,"},{"line_number":420,"context_line":"                                                  domain_id)"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F92E%3D","line":418,"in_reply_to":"AAAAVX%2F%2F%2B%2FU%3D","updated":"2014-02-27 04:45:28.000000000","message":"could write it as:\nif auth_context and OS-FEDERATION:identity_provider in auth_context ?","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"95de3f2e1f50a00cacd9633b808cf738553d4795","unresolved":false,"context_lines":[{"line_number":415,"context_line":"            trust \u003d self.trust_api.get_trust(metadata_ref[\u0027trust_id\u0027])"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        token_ref \u003d None"},{"line_number":418,"context_line":"        if \u0027saml2\u0027 in method_names:"},{"line_number":419,"context_line":"            token_ref \u003d self._handle_saml2_tokens(auth_context, project_id,"},{"line_number":420,"context_line":"                                                  domain_id)"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAVX%2F%2F7BU%3D","line":418,"in_reply_to":"AAAAVX%2F%2F92E%3D","updated":"2014-02-27 13:17:45.000000000","message":"Suggested staying with saml2 in method_names test. Otherwise the test clause is not true during unscoped token scoping operation  as no identity_provider, protocol parameters are present in the auth_context. See: https://review.openstack.org/#/c/71353/42/keystone/auth/plugins/saml2.py lines 63,64.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"93ef5ba33f79c5eb8803f6af72d63aa692f33945","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            idp \u003d auth_context[\u0027OS-FEDERATION:identity_provider\u0027]"},{"line_number":499,"context_line":"            protocol \u003d auth_context[\u0027OS-FEDERATION:protocol\u0027]"},{"line_number":500,"context_line":"            token_data[\u0027user\u0027].update({"},{"line_number":501,"context_line":"                \u0027OS-FEDERATION\u0027: {"},{"line_number":502,"context_line":"                    \u0027identity_provider\u0027: {\u0027id\u0027: idp},"},{"line_number":503,"context_line":"                    \u0027protocol\u0027: {\u0027id\u0027: protocol}"},{"line_number":504,"context_line":"                },"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FdY8%3D","line":501,"updated":"2014-02-26 14:12:32.000000000","message":"shouldn\u0027t this be also flattened to OS-FEDERATION:identity_provider, OS-FEDERATION:protocol, OS-FEDERATION:groups etc?","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d5aadc94861825934acbb66cc8316612f30fdece","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            idp \u003d auth_context[\u0027OS-FEDERATION:identity_provider\u0027]"},{"line_number":499,"context_line":"            protocol \u003d auth_context[\u0027OS-FEDERATION:protocol\u0027]"},{"line_number":500,"context_line":"            token_data[\u0027user\u0027].update({"},{"line_number":501,"context_line":"                \u0027OS-FEDERATION\u0027: {"},{"line_number":502,"context_line":"                    \u0027identity_provider\u0027: {\u0027id\u0027: idp},"},{"line_number":503,"context_line":"                    \u0027protocol\u0027: {\u0027id\u0027: protocol}"},{"line_number":504,"context_line":"                },"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FcDA%3D","line":501,"in_reply_to":"AAAAU3%2F%2FcFg%3D","updated":"2014-02-26 16:29:29.000000000","message":"fair enough.","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bd9c3eea3019c07794eeac7e5138616407794f9","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            idp \u003d auth_context[\u0027OS-FEDERATION:identity_provider\u0027]"},{"line_number":499,"context_line":"            protocol \u003d auth_context[\u0027OS-FEDERATION:protocol\u0027]"},{"line_number":500,"context_line":"            token_data[\u0027user\u0027].update({"},{"line_number":501,"context_line":"                \u0027OS-FEDERATION\u0027: {"},{"line_number":502,"context_line":"                    \u0027identity_provider\u0027: {\u0027id\u0027: idp},"},{"line_number":503,"context_line":"                    \u0027protocol\u0027: {\u0027id\u0027: protocol}"},{"line_number":504,"context_line":"                },"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAU3%2F%2FcFg%3D","line":501,"in_reply_to":"AAAAU3%2F%2FdY8%3D","updated":"2014-02-26 16:27:42.000000000","message":"I don\u0027t think we want to do that at the token level, it\u0027ll be tedious to expand upon. \n\nWe pulled out groups because it\u0027s a first class entity, and has room to grow (we can easily add name or another field).","commit_id":"cb18a27679e79cf4849c66c6a274c9ad4971d959"}]}
