)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"05f3439bdd6b2a1e4cbfc83865024accf26bd239","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Note: this patch also corrected some of the external auth tests where an"},{"line_number":10,"context_line":"auth request is consist of two methods with two different identities."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes Bug 1299012"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I5d7dd42d373879322823b16b215f11a015b734f8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAW3%2F%2Fx7Y%3D","line":12,"updated":"2014-04-10 13:35:46.000000000","message":"Closes-Bug: 1299012","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae567486cfa99de7f37fdd326e0156523579d1eb","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Make sure all the auth plugins agree on the shared identity attributes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Note: this patch also corrected some of the external auth tests where an"},{"line_number":10,"context_line":"auth request is consist of two methods with two different identities."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: 1299012"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAXH%2F%2FVUo%3D","line":10,"updated":"2014-04-22 13:23:39.000000000","message":"(NIT): \u0027where an auth request consists of\u0027","commit_id":"3bc50157ffe3f25abadd798212727e9a69aa4f47"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc2f93bfc562be43f2858b9b0e556dffccd1b694","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Make sure all the auth plugins agree on the shared identity attributes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Note: this patch also corrected some of the external auth tests where an"},{"line_number":10,"context_line":"auth request is consists of two methods with two different identities."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: 1299012"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9ad9bd40_fa7e29ae","line":10,"updated":"2014-05-06 19:54:41.000000000","message":"remove \u0027is\u0027","commit_id":"1f07808bbf99c0c1b2b434dd7280ac2a8b6d932a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Note: this patch also corrected some of the external auth tests where an"},{"line_number":10,"context_line":"auth request consists of two methods with two different identities."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: 1299012"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I5d7dd42d373879322823b16b215f11a015b734f8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7adec928_bba7fc09","line":12,"updated":"2014-05-20 00:37:04.000000000","message":"should be \"Closes-Bug: #1299012\"","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"}],"keystone/auth/controllers.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"84d6abffe6b96ab387e462c596de9e089ee37390","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# identity attributes need to be reconciled among the auth plugins"},{"line_number":42,"context_line":"IDENTITY_ATTRIBUTES \u003d [\u0027user_id\u0027, \u0027project_id\u0027, \u0027access_token_id\u0027,"},{"line_number":43,"context_line":"                       \u0027domain_id\u0027, \u0027expires_at\u0027]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def load_auth_methods():"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FmPs%3D","line":43,"updated":"2014-04-11 22:12:38.000000000","message":"(NIT): suggest use of a frozenset unless order matters, this helps to ensure that no one accidentally changes (remove/add) the values.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"84d6abffe6b96ab387e462c596de9e089ee37390","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    \"\"\"Set the attributes for auth context."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    For a given identity attribute, add it to the auth context if it does"},{"line_number":97,"context_line":"    not already exist. If the attribute already exist in auth context,"},{"line_number":98,"context_line":"    their values must be the same. Otherwise, an Unauthorized exception"},{"line_number":99,"context_line":"    is raised."},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FmPY%3D","line":97,"updated":"2014-04-11 22:12:38.000000000","message":"(NIT): change \u0027exist\u0027 to \u0027exists\u0027","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"4c47c9db2c0fd28f99a2002679dce0b1272e2f5c","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    For a given identity attribute, add it to the auth context if it does"},{"line_number":97,"context_line":"    not already exist. If the attribute already exist in auth context,"},{"line_number":98,"context_line":"    their values must be the same. Otherwise, an Unauthorized exception"},{"line_number":99,"context_line":"    is raised."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    :param auth_context: user authentication context, a dictionary shared"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FzgM%3D","line":98,"updated":"2014-04-10 13:08:18.000000000","message":"Some typos and precisions in the second sentence :\nIf the attribute already exists in auth context, its value must be the same (except for the expires_at attribute).","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"84d6abffe6b96ab387e462c596de9e089ee37390","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    For a given identity attribute, add it to the auth context if it does"},{"line_number":97,"context_line":"    not already exist. If the attribute already exist in auth context,"},{"line_number":98,"context_line":"    their values must be the same. Otherwise, an Unauthorized exception"},{"line_number":99,"context_line":"    is raised."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    :param auth_context: user authentication context, a dictionary shared"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FmPU%3D","line":98,"in_reply_to":"AAAAW3%2F%2FzgM%3D","updated":"2014-04-11 22:12:38.000000000","message":"++","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"4c47c9db2c0fd28f99a2002679dce0b1272e2f5c","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                    msg \u003d _(\u0027\"expires_at\" is different among the auth \u0027"},{"line_number":117,"context_line":"                            \u0027plug-ins. Will use the smallest value %s\u0027) % ("},{"line_number":118,"context_line":"                                auth_context[k])"},{"line_number":119,"context_line":"                    LOG.warning(msg)"},{"line_number":120,"context_line":"            elif auth_context[k] !\u003d v:"},{"line_number":121,"context_line":"                msg \u003d _(\u0027Unable to reconcile identity attribute %(attribute)s \u0027"},{"line_number":122,"context_line":"                        \u0027as it has conflicting values %(new)s and %(old)s\u0027) % ("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FzaM%3D","line":119,"updated":"2014-04-10 13:08:18.000000000","message":"The Warning should be displayed even if v \u003c auth_context[k]. To do that, the assignment `auth_context[k] \u003d min(v, auth_context[k])` should be done after the `if` block.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"27218b4c2919ea490f1dce82cb3241a91928e5f0","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class AuthContext(dict):"},{"line_number":93,"context_line":"    \"\"\"Retrofitting auth_context to effectively reconcole identity attributes."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    The identity attributes must not have conflicting values among the"},{"line_number":96,"context_line":"    auth plug-ins. The only exception is `expires_at`, where it will be"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FWis%3D","line":93,"updated":"2014-04-15 09:32:02.000000000","message":"typo: \"reconcile\"","commit_id":"93f4e85649a2e144ba479adf54e7e93f96e894be"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"27218b4c2919ea490f1dce82cb3241a91928e5f0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    \"\"\"Retrofitting auth_context to effectively reconcole identity attributes."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    The identity attributes must not have conflicting values among the"},{"line_number":96,"context_line":"    auth plug-ins. The only exception is `expires_at`, where it will be"},{"line_number":97,"context_line":"    consolidated to the lowest value."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FWXc%3D","line":96,"updated":"2014-04-15 09:32:02.000000000","message":"wording: The only exception is `expires_at`, which is set to its lowest value.","commit_id":"93f4e85649a2e144ba479adf54e7e93f96e894be"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"27218b4c2919ea490f1dce82cb3241a91928e5f0","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                # the shortest expiration instead."},{"line_number":107,"context_line":"                if existing_val !\u003d val:"},{"line_number":108,"context_line":"                    msg \u003d _(\u0027\"expires_at\" is different among the auth \u0027"},{"line_number":109,"context_line":"                            \u0027plug-ins. Will use the smallest value.\u0027)"},{"line_number":110,"context_line":"                    LOG.warning(msg)"},{"line_number":111,"context_line":"                val \u003d min(existing_val, val)"},{"line_number":112,"context_line":"            elif existing_val !\u003d val:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FWeA%3D","line":109,"updated":"2014-04-15 09:32:02.000000000","message":"IMHO, displaying the \u0027conflicting\u0027 expires_at values in the Warning message may be useful.","commit_id":"93f4e85649a2e144ba479adf54e7e93f96e894be"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"2dd52adacb209c284c05d24bd2a74c2e8d797588","unresolved":false,"context_lines":[{"line_number":38,"context_line":"AUTH_PLUGINS_LOADED \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# identity attributes need to be reconciled among the auth plugins"},{"line_number":41,"context_line":"IDENTITY_ATTRIBUTES \u003d frozenset([\u0027user_id\u0027, \u0027project_id\u0027, \u0027access_token_id\u0027,"},{"line_number":42,"context_line":"                                 \u0027domain_id\u0027, \u0027expires_at\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FZsc%3D","line":41,"updated":"2014-04-22 03:29:59.000000000","message":"maybe put these on the object unless they are used somewhere else.","commit_id":"010c52e539ec90f23d5a7cfdfd8a33bcee1d518f"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"2dd52adacb209c284c05d24bd2a74c2e8d797588","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __setitem__(self, key, val):"},{"line_number":102,"context_line":"        existing_val \u003d self.get(key)"},{"line_number":103,"context_line":"        if key in IDENTITY_ATTRIBUTES and existing_val is not None:"},{"line_number":104,"context_line":"            if key \u003d\u003d \u0027expires_at\u0027:"},{"line_number":105,"context_line":"                # special treatment for \u0027expires_at\u0027, we are going to take"},{"line_number":106,"context_line":"                # the shortest expiration instead."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FZso%3D","line":103,"updated":"2014-04-22 03:29:59.000000000","message":"is None a safe check here - what if some plugin sets the value to None? I think you want to try/except KeyError","commit_id":"010c52e539ec90f23d5a7cfdfd8a33bcee1d518f"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"2dd52adacb209c284c05d24bd2a74c2e8d797588","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                            \u0027and %(new)s.  Will use the smallest value.\u0027) % ("},{"line_number":110,"context_line":"                                {\u0027existing\u0027: existing_val,"},{"line_number":111,"context_line":"                                 \u0027new\u0027: val})"},{"line_number":112,"context_line":"                    LOG.warning(msg)"},{"line_number":113,"context_line":"                val \u003d min(existing_val, val)"},{"line_number":114,"context_line":"            elif existing_val !\u003d val:"},{"line_number":115,"context_line":"                msg \u003d _(\u0027Unable to reconcile identity attribute %(attribute)s \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FZuE%3D","line":112,"updated":"2014-04-22 03:29:59.000000000","message":"i don\u0027t think this should be a warning - it\u0027s debug or info at best.","commit_id":"010c52e539ec90f23d5a7cfdfd8a33bcee1d518f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fa3484ff29de7bb6d03160614410de0cae3668ff","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                            \u0027and %(new)s.  Will use the smallest value.\u0027) % ("},{"line_number":111,"context_line":"                                {\u0027existing\u0027: existing_val,"},{"line_number":112,"context_line":"                                 \u0027new\u0027: val})"},{"line_number":113,"context_line":"                    LOG.info(msg)"},{"line_number":114,"context_line":"                val \u003d min(existing_val, val)"},{"line_number":115,"context_line":"            elif existing_val !\u003d val:"},{"line_number":116,"context_line":"                msg \u003d _(\u0027Unable to reconcile identity attribute %(attribute)s \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad9bd40_04b77887","line":113,"updated":"2014-05-01 01:44:40.000000000","message":"This should probably be: LOG.info(msg, {...})","commit_id":"8a33ffe00fcbd946bc221aac57a92ad60baf8efd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fa3484ff29de7bb6d03160614410de0cae3668ff","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                                {\u0027existing\u0027: existing_val,"},{"line_number":112,"context_line":"                                 \u0027new\u0027: val})"},{"line_number":113,"context_line":"                    LOG.info(msg)"},{"line_number":114,"context_line":"                val \u003d min(existing_val, val)"},{"line_number":115,"context_line":"            elif existing_val !\u003d val:"},{"line_number":116,"context_line":"                msg \u003d _(\u0027Unable to reconcile identity attribute %(attribute)s \u0027"},{"line_number":117,"context_line":"                        \u0027as it has conflicting values %(new)s and %(old)s\u0027) % ("}],"source_content_type":"text/x-python","patch_set":7,"id":"9ad9bd40_84aaa817","line":114,"updated":"2014-05-01 01:44:40.000000000","message":"I don\u0027t think that this will work in Python3 because existing_val can be None.","commit_id":"8a33ffe00fcbd946bc221aac57a92ad60baf8efd"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e9c667ec4e8a851c079fee31c44750da7ddbfca4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                     \u0027expires_at\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __setitem__(self, key, val):"},{"line_number":103,"context_line":"        existing_val \u003d self.get(key)"},{"line_number":104,"context_line":"        if key in self.IDENTITY_ATTRIBUTES and key in self:"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027expires_at\u0027:"},{"line_number":106,"context_line":"                # special treatment for \u0027expires_at\u0027, we are going to take"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_227163e0","line":103,"updated":"2014-05-06 00:36:59.000000000","message":"nit: existing_val should be declared within if","commit_id":"6b2353e86baad75c50dbfa39224d44e662b1a465"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"1d4637698489560554bc21387bb98e14851246ec","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                     \u0027expires_at\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __setitem__(self, key, val):"},{"line_number":103,"context_line":"        existing_val \u003d self.get(key)"},{"line_number":104,"context_line":"        if key in self.IDENTITY_ATTRIBUTES and key in self:"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027expires_at\u0027:"},{"line_number":106,"context_line":"                # special treatment for \u0027expires_at\u0027, we are going to take"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_bd8af218","line":103,"in_reply_to":"9ad9bd40_227163e0","updated":"2014-05-06 01:19:06.000000000","message":"good catch!","commit_id":"6b2353e86baad75c50dbfa39224d44e662b1a465"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e9c667ec4e8a851c079fee31c44750da7ddbfca4","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            trust_ref \u003d self._lookup_trust("},{"line_number":236,"context_line":"                self.auth[\u0027scope\u0027][\u0027OS-TRUST:trust\u0027])"},{"line_number":237,"context_line":"            # TODO(ayoung): when trusts support domains, fill in domain data"},{"line_number":238,"context_line":"            if trust_ref.get(\u0027project_id\u0027) is not None:"},{"line_number":239,"context_line":"                project_ref \u003d self._lookup_project("},{"line_number":240,"context_line":"                    {\u0027id\u0027: trust_ref[\u0027project_id\u0027]})"},{"line_number":241,"context_line":"                self._scope_data \u003d (None, project_ref[\u0027id\u0027], trust_ref)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_8256af28","line":238,"updated":"2014-05-06 00:36:59.000000000","message":"unrelated? \n\nAlso why do people dislike the KeyError?","commit_id":"6b2353e86baad75c50dbfa39224d44e662b1a465"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"1d4637698489560554bc21387bb98e14851246ec","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            trust_ref \u003d self._lookup_trust("},{"line_number":236,"context_line":"                self.auth[\u0027scope\u0027][\u0027OS-TRUST:trust\u0027])"},{"line_number":237,"context_line":"            # TODO(ayoung): when trusts support domains, fill in domain data"},{"line_number":238,"context_line":"            if trust_ref.get(\u0027project_id\u0027) is not None:"},{"line_number":239,"context_line":"                project_ref \u003d self._lookup_project("},{"line_number":240,"context_line":"                    {\u0027id\u0027: trust_ref[\u0027project_id\u0027]})"},{"line_number":241,"context_line":"                self._scope_data \u003d (None, project_ref[\u0027id\u0027], trust_ref)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_dd8fb628","line":238,"in_reply_to":"9ad9bd40_8256af28","updated":"2014-05-06 01:19:06.000000000","message":"Matter of style preference I guess. With Python, there are many ways to do things.","commit_id":"6b2353e86baad75c50dbfa39224d44e662b1a465"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class AuthContext(dict):"},{"line_number":89,"context_line":"    \"\"\"Retrofitting auth_context to effectively reconcile identity attributes."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    The identity attributes must not have conflicting values among the"},{"line_number":92,"context_line":"    auth plug-ins. The only exception is `expires_at`, which is set to its"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_1b8f1076","line":89,"updated":"2014-05-20 00:37:04.000000000","message":"suggest remove \"effectively\" -- what does it mean here?","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    The identity attributes must not have conflicting values among the"},{"line_number":92,"context_line":"    auth plug-ins. The only exception is `expires_at`, which is set to its"},{"line_number":93,"context_line":"    lowest value."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_dbb12848","line":93,"updated":"2014-05-20 00:37:04.000000000","message":"suggest change \"lowest\" to \"earliest\"","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # identity attributes need to be reconciled among the auth plugins"},{"line_number":98,"context_line":"    IDENTITY_ATTRIBUTES \u003d frozenset([\u0027user_id\u0027, \u0027project_id\u0027,"},{"line_number":99,"context_line":"                                     \u0027access_token_id\u0027, \u0027domain_id\u0027,"},{"line_number":100,"context_line":"                                     \u0027expires_at\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __setitem__(self, key, val):"},{"line_number":103,"context_line":"        if key in self.IDENTITY_ATTRIBUTES and key in self:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_fbac24ef","line":100,"updated":"2014-05-20 00:37:04.000000000","message":"suggest put these in alphabetical order.\n\nAuthContext will contain extras, method_names, and bind -- should these also be in the list? (or should AuthContext not allow these to be set?)","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2e984efa4aaa8dd12a65967b383f1757137074c8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # identity attributes need to be reconciled among the auth plugins"},{"line_number":98,"context_line":"    IDENTITY_ATTRIBUTES \u003d frozenset([\u0027user_id\u0027, \u0027project_id\u0027,"},{"line_number":99,"context_line":"                                     \u0027access_token_id\u0027, \u0027domain_id\u0027,"},{"line_number":100,"context_line":"                                     \u0027expires_at\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __setitem__(self, key, val):"},{"line_number":103,"context_line":"        if key in self.IDENTITY_ATTRIBUTES and key in self:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_8102bc6d","line":100,"in_reply_to":"7adec928_fbac24ef","updated":"2014-05-20 16:40:40.000000000","message":"those attributes are additive and outside of our concern. The ones that we care about has to be consistent among the auth plugins.","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __setitem__(self, key, val):"},{"line_number":103,"context_line":"        if key in self.IDENTITY_ATTRIBUTES and key in self:"},{"line_number":104,"context_line":"            existing_val \u003d self.get(key)"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027expires_at\u0027:"},{"line_number":106,"context_line":"                # special treatment for \u0027expires_at\u0027, we are going to take"},{"line_number":107,"context_line":"                # the shortest expiration instead."}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_7b881471","line":104,"updated":"2014-05-20 00:37:04.000000000","message":"use self[key] since checked key is in self on previous line","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            existing_val \u003d self.get(key)"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027expires_at\u0027:"},{"line_number":106,"context_line":"                # special treatment for \u0027expires_at\u0027, we are going to take"},{"line_number":107,"context_line":"                # the shortest expiration instead."},{"line_number":108,"context_line":"                if existing_val !\u003d val:"},{"line_number":109,"context_line":"                    msg \u003d _(\u0027\"expires_at\" has conflicting values %(existing)s \u0027"},{"line_number":110,"context_line":"                            \u0027and %(new)s.  Will use the smallest value.\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_5bec382a","line":107,"updated":"2014-05-20 00:37:04.000000000","message":"suggest change \"shortest\" to \"earliest\"","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                # the shortest expiration instead."},{"line_number":108,"context_line":"                if existing_val !\u003d val:"},{"line_number":109,"context_line":"                    msg \u003d _(\u0027\"expires_at\" has conflicting values %(existing)s \u0027"},{"line_number":110,"context_line":"                            \u0027and %(new)s.  Will use the smallest value.\u0027)"},{"line_number":111,"context_line":"                    LOG.info(msg, {\u0027existing\u0027: existing_val, \u0027new\u0027: val})"},{"line_number":112,"context_line":"                if existing_val is None or val is None:"},{"line_number":113,"context_line":"                    val \u003d existing_val or val"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_db9848c2","line":110,"updated":"2014-05-20 00:37:04.000000000","message":"suggest change \"smallest\" to \"earliest\"","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            auth_info \u003d AuthInfo.create(context, auth\u003dauth)"},{"line_number":360,"context_line":"            auth_context \u003d AuthContext(extras\u003d{},"},{"line_number":361,"context_line":"                                       method_names\u003d[],"},{"line_number":362,"context_line":"                                       bind\u003d{})"},{"line_number":363,"context_line":"            self.authenticate(context, auth_info, auth_context)"},{"line_number":364,"context_line":"            if auth_context.get(\u0027access_token_id\u0027):"},{"line_number":365,"context_line":"                auth_info.set_scope(None, auth_context[\u0027project_id\u0027], None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_9bb32009","line":362,"updated":"2014-05-20 00:37:04.000000000","message":"seems like AuthContext() should set these automatically (in __init__())","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2e984efa4aaa8dd12a65967b383f1757137074c8","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            auth_info \u003d AuthInfo.create(context, auth\u003dauth)"},{"line_number":360,"context_line":"            auth_context \u003d AuthContext(extras\u003d{},"},{"line_number":361,"context_line":"                                       method_names\u003d[],"},{"line_number":362,"context_line":"                                       bind\u003d{})"},{"line_number":363,"context_line":"            self.authenticate(context, auth_info, auth_context)"},{"line_number":364,"context_line":"            if auth_context.get(\u0027access_token_id\u0027):"},{"line_number":365,"context_line":"                auth_info.set_scope(None, auth_context[\u0027project_id\u0027], None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_610bf07d","line":362,"in_reply_to":"7adec928_9bb32009","updated":"2014-05-20 16:40:40.000000000","message":"AuthContext is a generic dict. I am not seeing any advantage of setting them in __init__(). I prefer to do it here.","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f7278b0eeeb9e9757c8b15ae37a692ca4246fd29","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # identity attributes need to be reconciled among the auth plugins"},{"line_number":98,"context_line":"    IDENTITY_ATTRIBUTES \u003d frozenset([\u0027user_id\u0027, \u0027project_id\u0027,"},{"line_number":99,"context_line":"                                     \u0027access_token_id\u0027, \u0027domain_id\u0027,"},{"line_number":100,"context_line":"                                     \u0027expires_at\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __setitem__(self, key, val):"},{"line_number":103,"context_line":"        if key in self.IDENTITY_ATTRIBUTES and key in self:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7adec928_2a9b31ca","line":100,"updated":"2014-05-22 21:14:26.000000000","message":"suggest put these in alphabetical order.","commit_id":"23fa8c58d33cfeddb8935060fefdc26a612a21b2"}],"keystone/auth/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7c43ab7a4b1f8aff9526170c32b100fba11cbf99","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        :raises: exception.Unauthorized for authentication failure"},{"line_number":45,"context_line":"        \"\"\""},{"line_number":46,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":47,"context_line":"            if k in auth_context:"},{"line_number":48,"context_line":"                if auth_context[k] !\u003d v:"},{"line_number":49,"context_line":"                    msg \u003d _(\u0027Unable to reconcile identity attribute %s\u0027) % (k)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9kAM%3D","line":46,"updated":"2014-04-04 17:55:55.000000000","message":"six.iteritems(attrs)","commit_id":"9064f7abc48bd2421d3faae207ac688f6190a2c7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7c43ab7a4b1f8aff9526170c32b100fba11cbf99","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":47,"context_line":"            if k in auth_context:"},{"line_number":48,"context_line":"                if auth_context[k] !\u003d v:"},{"line_number":49,"context_line":"                    msg \u003d _(\u0027Unable to reconcile identity attribute %s\u0027) % (k)"},{"line_number":50,"context_line":"                    raise exception.Unauthorized(msg)"},{"line_number":51,"context_line":"            else:"},{"line_number":52,"context_line":"                auth_context[k] \u003d v"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9aUE%3D","line":49,"updated":"2014-04-04 17:55:55.000000000","message":"it\u0027d be helpful to include the two conflicting values here","commit_id":"9064f7abc48bd2421d3faae207ac688f6190a2c7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7c43ab7a4b1f8aff9526170c32b100fba11cbf99","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                    msg \u003d _(\u0027Unable to reconcile identity attribute %s\u0027) % (k)"},{"line_number":50,"context_line":"                    raise exception.Unauthorized(msg)"},{"line_number":51,"context_line":"            else:"},{"line_number":52,"context_line":"                auth_context[k] \u003d v"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def authenticate(self, context, auth_payload, auth_context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9aPY%3D","line":52,"updated":"2014-04-04 17:55:55.000000000","message":"i\u0027d *really* prefer for this work to be done *not* by the plugins, but by keystone itself between calls to plugins.","commit_id":"9064f7abc48bd2421d3faae207ac688f6190a2c7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"78ff0e6724b6bb34a55566653f1b84c2f748cd96","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                    msg \u003d _(\u0027Unable to reconcile identity attribute %s\u0027) % (k)"},{"line_number":50,"context_line":"                    raise exception.Unauthorized(msg)"},{"line_number":51,"context_line":"            else:"},{"line_number":52,"context_line":"                auth_context[k] \u003d v"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def authenticate(self, context, auth_payload, auth_context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9SCE%3D","line":52,"in_reply_to":"AAAAWH%2F9UYk%3D","updated":"2014-04-07 12:51:01.000000000","message":"++; if you\u0027re going to provide special treatment for expires_at, i\u0027d take the min() expiration (earliest date)","commit_id":"9064f7abc48bd2421d3faae207ac688f6190a2c7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ae63b2969884f073b3412f0d184250a45c63b9d6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                    msg \u003d _(\u0027Unable to reconcile identity attribute %s\u0027) % (k)"},{"line_number":50,"context_line":"                    raise exception.Unauthorized(msg)"},{"line_number":51,"context_line":"            else:"},{"line_number":52,"context_line":"                auth_context[k] \u003d v"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def authenticate(self, context, auth_payload, auth_context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9UYk%3D","line":52,"in_reply_to":"AAAAWH%2F9aPY%3D","updated":"2014-04-07 05:57:27.000000000","message":"Sure. But the trade-off with this approach is that plugins does not have control over all attributes. For example, only one plug-in can set the \u0027extra\u0027 or \u0027method_names\u0027. My point is not all attributes in auth_context need to agree. Some are meant to be extended/appended by different plug-ins.\n\nI suppose we can single out the attributes that we care about, namely \u0027user_id\u0027 and \u0027expires_at\u0027, and let plug-ins themselves reconcile the rest?","commit_id":"9064f7abc48bd2421d3faae207ac688f6190a2c7"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"4c47c9db2c0fd28f99a2002679dce0b1272e2f5c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                             \"extras\" is a dictionary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":42,"context_line":"        ``method_name`` is used to convey any additional authentication methods"},{"line_number":43,"context_line":"        in case authentication is for re-scoping. For example, if the"},{"line_number":44,"context_line":"        authentication is for re-scoping, plugin must append the previous"},{"line_number":45,"context_line":"        method names into ``method_names``. Also, plugin may add any additional"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FzSM%3D","line":42,"updated":"2014-04-10 13:08:18.000000000","message":"I think it should be ``method_names``.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ab2d143bee88457352556094e67f6cec63fba2ed","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                             \"extras\" is a dictionary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":42,"context_line":"        ``method_name`` is used to convey any additional authentication methods"},{"line_number":43,"context_line":"        in case authentication is for re-scoping. For example, if the"},{"line_number":44,"context_line":"        authentication is for re-scoping, plugin must append the previous"},{"line_number":45,"context_line":"        method names into ``method_names``. Also, plugin may add any additional"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FcA8%3D","line":42,"in_reply_to":"AAAAW3%2F%2FmMw%3D","updated":"2014-04-14 15:39:22.000000000","message":"Good catch! I\u0027ll submit a separate doc cleanup patch as Morgan suggested.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"84d6abffe6b96ab387e462c596de9e089ee37390","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                             \"extras\" is a dictionary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":42,"context_line":"        ``method_name`` is used to convey any additional authentication methods"},{"line_number":43,"context_line":"        in case authentication is for re-scoping. For example, if the"},{"line_number":44,"context_line":"        authentication is for re-scoping, plugin must append the previous"},{"line_number":45,"context_line":"        method names into ``method_names``. Also, plugin may add any additional"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FmMw%3D","line":42,"in_reply_to":"AAAAW3%2F%2FzSM%3D","updated":"2014-04-11 22:12:38.000000000","message":"This appears to be a long standing typo. Code seems to indicate ``method_names`` is correct instead of ``method_name``. Good catch Florent. This probably should be a \"doc cleanup\" commit independent of this changeset.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e9c667ec4e8a851c079fee31c44750da7ddbfca4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        :param auth_context: user authentication context, a dictionary shared"},{"line_number":37,"context_line":"                             by all plugins. It contains \"method_names\" and"},{"line_number":38,"context_line":"                             \"extras\" by default. \"method_names\" is a list and"},{"line_number":39,"context_line":"                             \"extras\" is a dictionary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":42,"context_line":"        ``method_name`` is used to convey any additional authentication methods"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_023a9fe6","line":39,"updated":"2014-05-06 00:36:59.000000000","message":"good fix, but unrelated.","commit_id":"6b2353e86baad75c50dbfa39224d44e662b1a465"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"1d4637698489560554bc21387bb98e14851246ec","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        :param auth_context: user authentication context, a dictionary shared"},{"line_number":37,"context_line":"                             by all plugins. It contains \"method_names\" and"},{"line_number":38,"context_line":"                             \"extras\" by default. \"method_names\" is a list and"},{"line_number":39,"context_line":"                             \"extras\" is a dictionary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        If successful, plugin must set ``user_id`` in ``auth_context``."},{"line_number":42,"context_line":"        ``method_name`` is used to convey any additional authentication methods"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_fdfc7a74","line":39,"in_reply_to":"9ad9bd40_023a9fe6","updated":"2014-05-06 01:19:06.000000000","message":"just corrected some minor docstring error. Probably don\u0027t need a separate bug and patch for this.","commit_id":"6b2353e86baad75c50dbfa39224d44e662b1a465"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \"\"\"Authenticate user and return an authentication context."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":34,"context_line":"        :param auth_payload: the content of the authentication for a given"},{"line_number":35,"context_line":"                             method"},{"line_number":36,"context_line":"        :param auth_context: user authentication context, a dictionary shared"},{"line_number":37,"context_line":"                             by all plugins. It contains \"method_names\" and"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_dbdf6867","line":34,"updated":"2014-05-20 00:37:04.000000000","message":"these changes should be done in a separate commit.","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2e984efa4aaa8dd12a65967b383f1757137074c8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \"\"\"Authenticate user and return an authentication context."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":34,"context_line":"        :param auth_payload: the content of the authentication for a given"},{"line_number":35,"context_line":"                             method"},{"line_number":36,"context_line":"        :param auth_context: user authentication context, a dictionary shared"},{"line_number":37,"context_line":"                             by all plugins. It contains \"method_names\" and"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_011cecc0","line":34,"in_reply_to":"7adec928_dbdf6867","updated":"2014-05-20 16:40:40.000000000","message":"they are easy enough to fix here. Don\u0027t like filing another bug just for that simple fix.","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"}],"keystone/tests/test_v3.py":[{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"4c47c9db2c0fd28f99a2002679dce0b1272e2f5c","unresolved":false,"context_lines":[{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def v3_request(self, path, **kwargs):"},{"line_number":392,"context_line":"        # TODO(gyee): need to fix all the v3 auth tests. They should not"},{"line_number":393,"context_line":"        # by requiring the token header."},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # check to see if caller require token for the API call."},{"line_number":396,"context_line":"        noauth \u003d kwargs.pop(\u0027noauth\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FytA%3D","line":393,"updated":"2014-04-10 13:08:18.000000000","message":"Wording: They should not require the token header.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"84d6abffe6b96ab387e462c596de9e089ee37390","unresolved":false,"context_lines":[{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # check to see if caller require token for the API call."},{"line_number":396,"context_line":"        noauth \u003d kwargs.pop(\u0027noauth\u0027, None)"},{"line_number":397,"context_line":"        if noauth:"},{"line_number":398,"context_line":"            return self.v3_noauth_request(path, **kwargs)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # Check if the caller has passed in auth details for"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FmB0%3D","line":397,"updated":"2014-04-11 22:12:38.000000000","message":"(NIT): This should be collapsed to one line:\n\n  if kwargs.pop(\u0027noauth\u0027, None):","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"8b2915c49f0abfc5c71916776486dccff279d3d7","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        # TODO(gyee): need to fix all the v3 auth tests. They should not"},{"line_number":393,"context_line":"        # require the token header."},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # check to see if caller require token for the API call."},{"line_number":396,"context_line":"        if kwargs.pop(\u0027noauth\u0027, None):"},{"line_number":397,"context_line":"            return self.v3_noauth_request(path, **kwargs)"},{"line_number":398,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8vc%3D","line":395,"updated":"2014-04-16 10:08:55.000000000","message":"typo: if the caller requires a token","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc2f93bfc562be43f2858b9b0e556dffccd1b694","unresolved":false,"context_lines":[{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def v3_request(self, path, **kwargs):"},{"line_number":359,"context_line":"        # TODO(gyee): need to fix all the v3 auth tests. They should not"},{"line_number":360,"context_line":"        # require the token header."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        # check to see if caller requires token for the API call."},{"line_number":363,"context_line":"        if kwargs.pop(\u0027noauth\u0027, None):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_1a010d06","line":360,"updated":"2014-05-06 19:54:41.000000000","message":"Should a bug be opened for this and referenced here?","commit_id":"1f07808bbf99c0c1b2b434dd7280ac2a8b6d932a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fce725ad7c1f709e9357488ef951d4f9b173f028","unresolved":false,"context_lines":[{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def v3_request(self, path, **kwargs):"},{"line_number":359,"context_line":"        # TODO(gyee): need to fix all the v3 auth tests. They should not"},{"line_number":360,"context_line":"        # require the token header."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        # check to see if caller requires token for the API call."},{"line_number":363,"context_line":"        if kwargs.pop(\u0027noauth\u0027, None):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_4f88d222","line":360,"in_reply_to":"9ad9bd40_1a010d06","updated":"2014-05-07 20:43:19.000000000","message":"https://bugs.launchpad.net/keystone/+bug/1317261","commit_id":"1f07808bbf99c0c1b2b434dd7280ac2a8b6d932a"}],"keystone/tests/test_v3_auth.py":[{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"4c47c9db2c0fd28f99a2002679dce0b1272e2f5c","unresolved":false,"context_lines":[{"line_number":2163,"context_line":"        remote_user \u003d self.default_domain_user[\u0027name\u0027]"},{"line_number":2164,"context_line":"        self.admin_app.extra_environ.update({\u0027REMOTE_USER\u0027: remote_user,"},{"line_number":2165,"context_line":"                                             \u0027AUTH_TYPE\u0027: \u0027Negotiate\u0027})"},{"line_number":2166,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, noauth\u003dTrue)"},{"line_number":2167,"context_line":"        token \u003d self.assertValidUnscopedTokenResponse(r)"},{"line_number":2168,"context_line":"        self.assertNotIn(\u0027bind\u0027, token)"},{"line_number":2169,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FyC0%3D","line":2166,"updated":"2014-04-10 13:08:18.000000000","message":"BTW, I couldn\u0027t find where this noauth parameter was consumed.","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ab2d143bee88457352556094e67f6cec63fba2ed","unresolved":false,"context_lines":[{"line_number":2163,"context_line":"        remote_user \u003d self.default_domain_user[\u0027name\u0027]"},{"line_number":2164,"context_line":"        self.admin_app.extra_environ.update({\u0027REMOTE_USER\u0027: remote_user,"},{"line_number":2165,"context_line":"                                             \u0027AUTH_TYPE\u0027: \u0027Negotiate\u0027})"},{"line_number":2166,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, noauth\u003dTrue)"},{"line_number":2167,"context_line":"        token \u003d self.assertValidUnscopedTokenResponse(r)"},{"line_number":2168,"context_line":"        self.assertNotIn(\u0027bind\u0027, token)"},{"line_number":2169,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2Fb%2Bw%3D","line":2166,"in_reply_to":"AAAAW3%2F%2FyC0%3D","updated":"2014-04-14 15:39:22.000000000","message":"It was used in test_v3.py line 397","commit_id":"fa4488dead11175be601f00deca4756b1455044e"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"8b2915c49f0abfc5c71916776486dccff279d3d7","unresolved":false,"context_lines":[{"line_number":2235,"context_line":"        # cleanup the REMOTE_USER information from the previous call."},{"line_number":2236,"context_line":"        del self.admin_app.extra_environ[\u0027REMOTE_USER\u0027]"},{"line_number":2237,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: v2_token_id}"},{"line_number":2238,"context_line":"        resp \u003d self.get(\u0027/auth/tokens\u0027, headers\u003dheaders)"},{"line_number":2239,"context_line":"        token_data \u003d resp.result"},{"line_number":2240,"context_line":""},{"line_number":2241,"context_line":"        self.assertDictEqual(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027bind\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F9KY%3D","line":2238,"updated":"2014-04-16 10:08:55.000000000","message":"I think you should use your `noauth\u003dTrue` parameter there, since there\u0027s no need to get another token.","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"84f23d6d3b34f7cf9e60d1f6e39903df0af442a9","unresolved":false,"context_lines":[{"line_number":2235,"context_line":"        # cleanup the REMOTE_USER information from the previous call."},{"line_number":2236,"context_line":"        del self.admin_app.extra_environ[\u0027REMOTE_USER\u0027]"},{"line_number":2237,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: v2_token_id}"},{"line_number":2238,"context_line":"        resp \u003d self.get(\u0027/auth/tokens\u0027, headers\u003dheaders)"},{"line_number":2239,"context_line":"        token_data \u003d resp.result"},{"line_number":2240,"context_line":""},{"line_number":2241,"context_line":"        self.assertDictEqual(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027bind\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2Fcpk%3D","line":2238,"in_reply_to":"AAAAXH%2F%2F9KY%3D","updated":"2014-04-21 18:28:08.000000000","message":"No because this is for token validation. Token validation is a protected API.","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"1e52907fa8cb251d80b55035f2e08682fee09df4","unresolved":false,"context_lines":[{"line_number":2235,"context_line":"        # cleanup the REMOTE_USER information from the previous call."},{"line_number":2236,"context_line":"        del self.admin_app.extra_environ[\u0027REMOTE_USER\u0027]"},{"line_number":2237,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: v2_token_id}"},{"line_number":2238,"context_line":"        resp \u003d self.get(\u0027/auth/tokens\u0027, headers\u003dheaders)"},{"line_number":2239,"context_line":"        token_data \u003d resp.result"},{"line_number":2240,"context_line":""},{"line_number":2241,"context_line":"        self.assertDictEqual(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027bind\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2Fa2Q%3D","line":2238,"in_reply_to":"AAAAXH%2F%2Fcpk%3D","updated":"2014-04-21 22:59:02.000000000","message":"ok, it makes sense.","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"8b2915c49f0abfc5c71916776486dccff279d3d7","unresolved":false,"context_lines":[{"line_number":2308,"context_line":"        self.assertValidUnscopedTokenResponse(r)"},{"line_number":2309,"context_line":""},{"line_number":2310,"context_line":"    def test_auth_methods_with_different_identities_failed(self):"},{"line_number":2311,"context_line":"        # get the token for a user"},{"line_number":2312,"context_line":"        token \u003d self.get_scoped_token()"},{"line_number":2313,"context_line":"        # try both password and token methods with different identities and it"},{"line_number":2314,"context_line":"        # should fail"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8xg%3D","line":2311,"updated":"2014-04-16 10:08:55.000000000","message":"Can you please specify that the first token you get corresponds to self.user, which is a different user than self.default_domain_user.","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":8996,"name":"Florent Flament","email":"contact@florentflament.com","username":"florent"},"change_message_id":"8b2915c49f0abfc5c71916776486dccff279d3d7","unresolved":false,"context_lines":[{"line_number":3061,"context_line":"                self.auth_context[identity_attr] \u003d uuid.uuid4().hex"},{"line_number":3062,"context_line":"            except exception.Unauthorized:"},{"line_number":3063,"context_line":"                # expected"},{"line_number":3064,"context_line":"                pass"},{"line_number":3065,"context_line":""},{"line_number":3066,"context_line":"    def test_non_identity_attribute_conflict_override(self):"},{"line_number":3067,"context_line":"        # for attributes Keystone doesn\u0027t know about, make sure they can be"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F93A%3D","line":3064,"updated":"2014-04-16 10:08:55.000000000","message":"I think that this try except block doesn\u0027t ensure that assigning different values to an identity attribute actually raises an exception. If the assignment `self.auth_context[identity_attr] \u003d uuid.uuid4().hex` in your try block doesn\u0027t raise anything, the test will pass anyway.\n\nI think you should use self.assertRaises to ensure that the Unauthorized exception is properly raised.","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"84f23d6d3b34f7cf9e60d1f6e39903df0af442a9","unresolved":false,"context_lines":[{"line_number":3061,"context_line":"                self.auth_context[identity_attr] \u003d uuid.uuid4().hex"},{"line_number":3062,"context_line":"            except exception.Unauthorized:"},{"line_number":3063,"context_line":"                # expected"},{"line_number":3064,"context_line":"                pass"},{"line_number":3065,"context_line":""},{"line_number":3066,"context_line":"    def test_non_identity_attribute_conflict_override(self):"},{"line_number":3067,"context_line":"        # for attributes Keystone doesn\u0027t know about, make sure they can be"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2FcYo%3D","line":3064,"in_reply_to":"AAAAXH%2F%2F93A%3D","updated":"2014-04-21 18:28:08.000000000","message":"good catch!","commit_id":"a02d6f5d37a47b08a088203710a66c34f8fe823b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3d01a0c7bd39e690e885edf6ab59fcfa8f977d05","unresolved":false,"context_lines":[{"line_number":2308,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":2309,"context_line":"        self.assertValidUnscopedTokenResponse(r)"},{"line_number":2310,"context_line":""},{"line_number":2311,"context_line":"    def test_auth_methods_with_different_identities_failed(self):"},{"line_number":2312,"context_line":"        # get the token for a user. This is self.user which is different from"},{"line_number":2313,"context_line":"        # self.default_domain_user."},{"line_number":2314,"context_line":"        token \u003d self.get_scoped_token()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_9b0ec0e3","line":2311,"updated":"2014-05-20 00:37:04.000000000","message":"change \"failed\" to \"fails\"","commit_id":"e7287a16705c897d6751fd44b4c06f1f2dcf0c04"}]}
