)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add audit ids to tokens"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add audit identifiers to each token. If the token is a rescoped token"},{"line_number":10,"context_line":"the audit identifier will be a list of index 0 being the token\u0027s audit"},{"line_number":11,"context_line":"id and index 1 being the initial token in the chain\u0027s audit_id."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"If the token is not rescoped, the token\u0027s audit_ids will only contain"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1abeadc6_e8de9610","line":10,"updated":"2014-08-19 22:34:28.000000000","message":"this sentence doesn\u0027t make sense... a list of index 0? how about \"a list where index 0 is the token\u0027s audit ID and index 1 is the ...\"","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":14,"context_line":"the audit_id of the token itself (at index 0)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This change is to resolve a method of performing token revocations"},{"line_number":17,"context_line":"on individual tokens without needing to rely on the sometimes low"},{"line_number":18,"context_line":"resolution of token expires time."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1abeadc6_88cd2260","line":17,"updated":"2014-08-19 22:34:28.000000000","message":"it\u0027s always low since it\u0027s only milliseconds at best.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"abbe9687001096a2d19050738c9b0b0029c6e8be","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add audit ids to tokens"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add audit identifiers to each token. If the token is a rescoped token"},{"line_number":10,"context_line":"the audit identifier will be a list where index 0 being the token\u0027s "},{"line_number":11,"context_line":"audit id and index 1 is the initial token in the chain\u0027s audit_id."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"If the token is not rescoped, the token\u0027s audit_ids will only contain"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1abeadc6_ccbd4eb9","line":10,"updated":"2014-08-20 16:18:25.000000000","message":"(nit) space","commit_id":"56527ee6575455ab664c3b7b247ef3db62cc2719"}],"keystone/auth/plugins/token.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            except IndexError:"},{"line_number":67,"context_line":"                # NOTE(morganfainberg): In the case this is a token that was"},{"line_number":68,"context_line":"                # issued prior to audit id existing, the chain is not tracked."},{"line_number":69,"context_line":"                token_audit_id \u003d None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            # New tokens are not allowed to extend the expiration"},{"line_number":72,"context_line":"            # time of an old token, otherwise, they could be extened"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_8869a227","line":69,"updated":"2014-08-19 22:34:28.000000000","message":"I\u0027m not sure I totally understand the implications of this... could we make it easier on us and reject these requests? Or maybe leave off the audit_ids if the parent token didn\u0027t have an audit ID (This is a case that revocation events has to handle anyways).","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            except IndexError:"},{"line_number":67,"context_line":"                # NOTE(morganfainberg): In the case this is a token that was"},{"line_number":68,"context_line":"                # issued prior to audit id existing, the chain is not tracked."},{"line_number":69,"context_line":"                token_audit_id \u003d None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            # New tokens are not allowed to extend the expiration"},{"line_number":72,"context_line":"            # time of an old token, otherwise, they could be extened"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_3ecfe4b1","line":69,"in_reply_to":"1abeadc6_8869a227","updated":"2014-08-19 23:14:06.000000000","message":"We can\u0027t eliminate this code unless we want to immediately (on upgrade) reject all previously issued tokens. This is sadly, I think, a requirement.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                    timeutils.parse_isotime(token_ref[\u0027token\u0027][\u0027expires\u0027]))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"            user_context.setdefault(\u0027expires_at\u0027, expires_at)"},{"line_number":83,"context_line":"            user_context[\u0027token_audit_id\u0027] \u003d token_audit_id"},{"line_number":84,"context_line":"            user_context.setdefault(\u0027user_id\u0027, token_ref[\u0027user\u0027][\u0027id\u0027])"},{"line_number":85,"context_line":"            user_context[\u0027extras\u0027].update(token_ref.get(\u0027extras\u0027, {}))"},{"line_number":86,"context_line":"            user_context[\u0027method_names\u0027].extend(token_ref.get(\u0027methods\u0027, []))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_e8905645","line":83,"updated":"2014-08-19 22:34:28.000000000","message":"shouldn\u0027t this just be \"audit_id\"? all of these are from the token.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                    timeutils.parse_isotime(token_ref[\u0027token\u0027][\u0027expires\u0027]))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"            user_context.setdefault(\u0027expires_at\u0027, expires_at)"},{"line_number":83,"context_line":"            user_context[\u0027token_audit_id\u0027] \u003d token_audit_id"},{"line_number":84,"context_line":"            user_context.setdefault(\u0027user_id\u0027, token_ref[\u0027user\u0027][\u0027id\u0027])"},{"line_number":85,"context_line":"            user_context[\u0027extras\u0027].update(token_ref.get(\u0027extras\u0027, {}))"},{"line_number":86,"context_line":"            user_context[\u0027method_names\u0027].extend(token_ref.get(\u0027methods\u0027, []))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_de38b0a2","line":83,"in_reply_to":"1abeadc6_e8905645","updated":"2014-08-19 23:14:06.000000000","message":"Sure, changed next patch.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"}],"keystone/models/token_model.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"15d0f85a0ecb57654f61d4af24d40600b4a2529f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if self.version is V3:"},{"line_number":86,"context_line":"                return self.get(\u0027audit_ids\u0027, [])[1]"},{"line_number":87,"context_line":"            return self[\u0027token\u0027].get(\u0027audit_ids\u0027, [])[1]"},{"line_number":88,"context_line":"        except IndexError:"},{"line_number":89,"context_line":"            return None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_e8721b48","line":88,"updated":"2014-08-19 22:57:51.000000000","message":"Is there a reason to do this instead of letting .get() return None?","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            if self.version is V3:"},{"line_number":86,"context_line":"                return self.get(\u0027audit_ids\u0027, [])[1]"},{"line_number":87,"context_line":"            return self[\u0027token\u0027].get(\u0027audit_ids\u0027, [])[1]"},{"line_number":88,"context_line":"        except IndexError:"},{"line_number":89,"context_line":"            return None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_3e5d24ea","line":88,"in_reply_to":"1abeadc6_e8721b48","updated":"2014-08-19 23:14:06.000000000","message":"I\u0027ll convert this over to what I did further down the chain. \nThe chain_id *technically* should be the same as the audit_id for revocation event purposes, but there isn\u0027t a need to stick duplicated data in the token field.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"}],"keystone/tests/test_auth.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from oslo.utils import timeutils"},{"line_number":21,"context_line":"from testtools import matchers"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone import assignment"},{"line_number":25,"context_line":"from keystone import auth"},{"line_number":26,"context_line":"from keystone.common import authorization"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_889fe24f","line":23,"updated":"2014-08-19 22:34:28.000000000","message":"there\u0027s an extra blank line here.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from oslo.utils import timeutils"},{"line_number":21,"context_line":"from testtools import matchers"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone import assignment"},{"line_number":25,"context_line":"from keystone import auth"},{"line_number":26,"context_line":"from keystone.common import authorization"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_5e73c07f","line":23,"in_reply_to":"1abeadc6_889fe24f","updated":"2014-08-19 23:14:06.000000000","message":"fixed in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"15d0f85a0ecb57654f61d4af24d40600b4a2529f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.assertCloseEnoughForGovernmentWork("},{"line_number":109,"context_line":"            timeutils.parse_isotime(a[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]),"},{"line_number":110,"context_line":"            timeutils.parse_isotime(b[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]))"},{"line_number":111,"context_line":"        if not ignore_audit_ids:"},{"line_number":112,"context_line":"            self.assertIn(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027][0],"},{"line_number":113,"context_line":"                          b[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027])"},{"line_number":114,"context_line":"            self.assertThat(len(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027]),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_0bbf4cd1","line":111,"updated":"2014-08-19 22:57:51.000000000","message":"I think this is a little strange here because it\u0027s not actually checking for equality, it\u0027s checking for a parent-child-like relationship. I see why you had to do it to not break existing tests, but it was confusing when I first saw it.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.assertCloseEnoughForGovernmentWork("},{"line_number":109,"context_line":"            timeutils.parse_isotime(a[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]),"},{"line_number":110,"context_line":"            timeutils.parse_isotime(b[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]))"},{"line_number":111,"context_line":"        if not ignore_audit_ids:"},{"line_number":112,"context_line":"            self.assertIn(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027][0],"},{"line_number":113,"context_line":"                          b[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027])"},{"line_number":114,"context_line":"            self.assertThat(len(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027]),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_a8fd7e3c","line":111,"updated":"2014-08-19 22:34:28.000000000","message":"it\u0027s easier to reason about positive checks rather than negative ones... change the argument to \"enforce_audit_ids\u003dTrue\".","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.assertCloseEnoughForGovernmentWork("},{"line_number":109,"context_line":"            timeutils.parse_isotime(a[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]),"},{"line_number":110,"context_line":"            timeutils.parse_isotime(b[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]))"},{"line_number":111,"context_line":"        if not ignore_audit_ids:"},{"line_number":112,"context_line":"            self.assertIn(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027][0],"},{"line_number":113,"context_line":"                          b[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027])"},{"line_number":114,"context_line":"            self.assertThat(len(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027]),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_7ee31c05","line":111,"in_reply_to":"1abeadc6_0bbf4cd1","updated":"2014-08-19 23:14:06.000000000","message":"This is a lacking in our current tests, but I really would rather not restructure huge swaths of tests in this case when we\u0027re really checking if the bulk of the token data is the same (we do similar mucking in the token above because values differ).\n\nMaybe this should be assertTokenCloseEnoughForGovermentWork","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.assertCloseEnoughForGovernmentWork("},{"line_number":109,"context_line":"            timeutils.parse_isotime(a[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]),"},{"line_number":110,"context_line":"            timeutils.parse_isotime(b[\u0027access\u0027][\u0027token\u0027][\u0027issued_at\u0027]))"},{"line_number":111,"context_line":"        if not ignore_audit_ids:"},{"line_number":112,"context_line":"            self.assertIn(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027][0],"},{"line_number":113,"context_line":"                          b[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027])"},{"line_number":114,"context_line":"            self.assertThat(len(a[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027]),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_9e6d589b","line":111,"in_reply_to":"1abeadc6_a8fd7e3c","updated":"2014-08-19 23:14:06.000000000","message":"Done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a9d3b047822d955b7bc61b364bd85bfee52d19fc","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        self.assertIsNotNone(starting_audit_id)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        # get another token to ensure the correct parent audit_id is set"},{"line_number":478,"context_line":"        body_dict \u003d _build_user_auth(token\u003dunscoped_token[\"access\"][\"token\"])"},{"line_number":479,"context_line":"        unscoped_token_2 \u003d self.controller.authenticate(context, body_dict)"},{"line_number":480,"context_line":"        audit_ids \u003d get_audit_ids(unscoped_token_2)"},{"line_number":481,"context_line":"        self.assertThat(audit_ids, matchers.HasLength(2))"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_8f9dfb68","line":478,"updated":"2014-08-20 22:40:15.000000000","message":"use \u0027 for strings consistently.","commit_id":"56527ee6575455ab664c3b7b247ef3db62cc2719"}],"keystone/tests/unit/token/test_token_data_helper.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"15d0f85a0ecb57654f61d4af24d40600b4a2529f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_v3_token_data_helper_populate_audit_info_string(self):"},{"line_number":29,"context_line":"        token_data \u003d {}"},{"line_number":30,"context_line":"        audit_info \u003d uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3]"},{"line_number":31,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, audit_info)"},{"line_number":32,"context_line":"        self.assertIn(audit_info, token_data[\u0027audit_ids\u0027])"},{"line_number":33,"context_line":"        self.assertThat(token_data[\u0027audit_ids\u0027], matchers.HasLength(2))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_a8f4a387","line":30,"updated":"2014-08-19 22:57:51.000000000","message":"I don\u0027t think this will work in Python3. I\u0027m pretty sure the bytes type doesn\u0027t have an encode method.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_v3_token_data_helper_populate_audit_info_string(self):"},{"line_number":29,"context_line":"        token_data \u003d {}"},{"line_number":30,"context_line":"        audit_info \u003d uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3]"},{"line_number":31,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, audit_info)"},{"line_number":32,"context_line":"        self.assertIn(audit_info, token_data[\u0027audit_ids\u0027])"},{"line_number":33,"context_line":"        self.assertThat(token_data[\u0027audit_ids\u0027], matchers.HasLength(2))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_de899027","line":30,"in_reply_to":"1abeadc6_a8f4a387","updated":"2014-08-19 23:14:06.000000000","message":"I\u0027ll conver this to:\n\n   codecs.encode(uuid.uuid4().bytes, \u0027base64\u0027)[:-3]","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_v3_token_data_helper_populate_audit_info_none(self):"},{"line_number":36,"context_line":"        token_data \u003d {}"},{"line_number":37,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, None)"},{"line_number":38,"context_line":"        self.assertThat(token_data[\u0027audit_ids\u0027], matchers.HasLength(1))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_v3_token_data_helper_populate_audit_info_list(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_c8a9da7c","line":37,"updated":"2014-08-19 22:34:28.000000000","message":"give a name to the None parameter so we know what it is.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_v3_token_data_helper_populate_audit_info_none(self):"},{"line_number":36,"context_line":"        token_data \u003d {}"},{"line_number":37,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, None)"},{"line_number":38,"context_line":"        self.assertThat(token_data[\u0027audit_ids\u0027], matchers.HasLength(1))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_v3_token_data_helper_populate_audit_info_list(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_1e84e80a","line":37,"in_reply_to":"1abeadc6_c8a9da7c","updated":"2014-08-19 23:14:06.000000000","message":"done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"15d0f85a0ecb57654f61d4af24d40600b4a2529f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def test_v3_token_data_helper_populate_audit_info_none(self):"},{"line_number":36,"context_line":"        token_data \u003d {}"},{"line_number":37,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, None)"},{"line_number":38,"context_line":"        self.assertThat(token_data[\u0027audit_ids\u0027], matchers.HasLength(1))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_v3_token_data_helper_populate_audit_info_list(self):"},{"line_number":41,"context_line":"        token_data \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_0b790c93","line":38,"updated":"2014-08-19 22:57:51.000000000","message":"Maybe just verify that the list doesn\u0027t contain a None to show that an ID is generated.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def test_v3_token_data_helper_populate_audit_info_none(self):"},{"line_number":36,"context_line":"        token_data \u003d {}"},{"line_number":37,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, None)"},{"line_number":38,"context_line":"        self.assertThat(token_data[\u0027audit_ids\u0027], matchers.HasLength(1))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_v3_token_data_helper_populate_audit_info_list(self):"},{"line_number":41,"context_line":"        token_data \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_3e87e410","line":38,"in_reply_to":"1abeadc6_0b790c93","updated":"2014-08-19 23:14:06.000000000","message":"done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"abbe9687001096a2d19050738c9b0b0029c6e8be","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_v3_token_data_helper_populate_audit_info_list(self):"},{"line_number":43,"context_line":"        token_data \u003d {}"},{"line_number":44,"context_line":"        audit_info \u003d [uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3],"},{"line_number":45,"context_line":"                      uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3]]"},{"line_number":46,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, audit_info)"},{"line_number":47,"context_line":"        self.assertEqual(audit_info, token_data[\u0027audit_ids\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_ec33ea5f","line":44,"updated":"2014-08-20 16:18:25.000000000","message":"These will have the same Python3 issue","commit_id":"56527ee6575455ab664c3b7b247ef3db62cc2719"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"026ffcdf82c2969958f031f77cccc8fb0b123d31","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_v3_token_data_helper_populate_audit_info_list(self):"},{"line_number":43,"context_line":"        token_data \u003d {}"},{"line_number":44,"context_line":"        audit_info \u003d [uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3],"},{"line_number":45,"context_line":"                      uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3]]"},{"line_number":46,"context_line":"        self.v3_data_helper._populate_audit_info(token_data, audit_info)"},{"line_number":47,"context_line":"        self.assertEqual(audit_info, token_data[\u0027audit_ids\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_8f534838","line":44,"in_reply_to":"1abeadc6_ec33ea5f","updated":"2014-08-20 16:49:09.000000000","message":"Ack, i missed this one. I\u0027ll followup with a quick fix.","commit_id":"56527ee6575455ab664c3b7b247ef3db62cc2719"}],"keystone/token/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                    audit_id \u003d token_data[\u0027access\u0027][\u0027token\u0027].get("},{"line_number":258,"context_line":"                        \u0027audit_ids\u0027, [])[-1]"},{"line_number":259,"context_line":"                else:"},{"line_number":260,"context_line":"                    audit_id \u003d token_data[\u0027token\u0027].get(\u0027audit_ids\u0027)[-1]"},{"line_number":261,"context_line":"            except IndexError:"},{"line_number":262,"context_line":"                # NOTE(morganfainberg): When transitioning from tokens without"},{"line_number":263,"context_line":"                # audit_ids to tokens with audit ids it some tokens may not"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_8b0fdc2d","line":260,"updated":"2014-08-19 22:34:28.000000000","message":"should .get(\u0027audit_ids\u0027, []), otherwise this could fail with an AttributeError,\n\nor if audit_ids is always in token then token_data[\u0027token\u0027][\u0027audit_ids\u0027]","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                    audit_id \u003d token_data[\u0027access\u0027][\u0027token\u0027].get("},{"line_number":258,"context_line":"                        \u0027audit_ids\u0027, [])[-1]"},{"line_number":259,"context_line":"                else:"},{"line_number":260,"context_line":"                    audit_id \u003d token_data[\u0027token\u0027].get(\u0027audit_ids\u0027)[-1]"},{"line_number":261,"context_line":"            except IndexError:"},{"line_number":262,"context_line":"                # NOTE(morganfainberg): When transitioning from tokens without"},{"line_number":263,"context_line":"                # audit_ids to tokens with audit ids it some tokens may not"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_5e7d801b","line":260,"in_reply_to":"1abeadc6_8b0fdc2d","updated":"2014-08-19 23:14:06.000000000","message":"done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                # audit_ids to tokens with audit ids it some tokens may not"},{"line_number":264,"context_line":"                # have an audit_id, and the lookup will cause an IndexError"},{"line_number":265,"context_line":"                # to be raised."},{"line_number":266,"context_line":"                pass"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return (current_user_ref, tenant_ref, metadata_ref, expiry, bind,"},{"line_number":269,"context_line":"                audit_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_283deede","line":266,"updated":"2014-08-19 22:34:28.000000000","message":"Here\u0027s another spot where I think it would be safer to reject these requests, or maybe it\u0027s better to not put the audit ID in the token if the original token didn\u0027t have one since revocation events will have to handle that case anyways.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                # audit_ids to tokens with audit ids it some tokens may not"},{"line_number":264,"context_line":"                # have an audit_id, and the lookup will cause an IndexError"},{"line_number":265,"context_line":"                # to be raised."},{"line_number":266,"context_line":"                pass"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return (current_user_ref, tenant_ref, metadata_ref, expiry, bind,"},{"line_number":269,"context_line":"                audit_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_7e787c2b","line":266,"in_reply_to":"1abeadc6_283deede","updated":"2014-08-19 23:14:06.000000000","message":"Same answer as before.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            user_id, tenant_id)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        expiry \u003d provider.default_expire_time()"},{"line_number":327,"context_line":"        return (user_ref, tenant_ref, metadata_ref, expiry, None, None)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def _authenticate_external(self, context, auth):"},{"line_number":330,"context_line":"        \"\"\"Try to authenticate an external user via REMOTE_USER variable."}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_eb4e906e","line":327,"updated":"2014-08-19 22:34:28.000000000","message":"Give a name to the None field so we know what it is.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            user_id, tenant_id)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        expiry \u003d provider.default_expire_time()"},{"line_number":327,"context_line":"        return (user_ref, tenant_ref, metadata_ref, expiry, None, None)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def _authenticate_external(self, context, auth):"},{"line_number":330,"context_line":"        \"\"\"Try to authenticate an external user via REMOTE_USER variable."}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_de90b045","line":327,"in_reply_to":"1abeadc6_eb4e906e","updated":"2014-08-19 23:14:06.000000000","message":"done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                environment.get(\u0027AUTH_TYPE\u0027, \u0027\u0027).lower() \u003d\u003d \u0027negotiate\u0027):"},{"line_number":360,"context_line":"            bind \u003d {\u0027kerberos\u0027: username}"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        return (user_ref, tenant_ref, metadata_ref, expiry, bind, None)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _get_auth_token_data(self, user, tenant, metadata, expiry, audit_id):"},{"line_number":365,"context_line":"        return dict(user\u003duser,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_4b5ce425","line":362,"updated":"2014-08-19 22:34:28.000000000","message":"Give a name to the None field so we know what it is.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                environment.get(\u0027AUTH_TYPE\u0027, \u0027\u0027).lower() \u003d\u003d \u0027negotiate\u0027):"},{"line_number":360,"context_line":"            bind \u003d {\u0027kerberos\u0027: username}"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        return (user_ref, tenant_ref, metadata_ref, expiry, bind, None)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _get_auth_token_data(self, user, tenant, metadata, expiry, audit_id):"},{"line_number":365,"context_line":"        return dict(user\u003duser,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_fe93ac4c","line":362,"in_reply_to":"1abeadc6_4b5ce425","updated":"2014-08-19 23:14:06.000000000","message":"done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"}],"keystone/token/provider.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"15d0f85a0ecb57654f61d4af24d40600b4a2529f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    :type parent_audit_id: str"},{"line_number":92,"context_line":"    :returns: Keystone token audit data"},{"line_number":93,"context_line":"    \"\"\""},{"line_number":94,"context_line":"    audit_id \u003d uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3]"},{"line_number":95,"context_line":"    if parent_audit_id is not None:"},{"line_number":96,"context_line":"        return [audit_id, parent_audit_id]"},{"line_number":97,"context_line":"    return [audit_id]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_0862f73d","line":94,"updated":"2014-08-19 22:57:51.000000000","message":"Same Python3 issue","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    :type parent_audit_id: str"},{"line_number":92,"context_line":"    :returns: Keystone token audit data"},{"line_number":93,"context_line":"    \"\"\""},{"line_number":94,"context_line":"    audit_id \u003d uuid.uuid4().bytes.encode(\u0027base64\u0027)[:-3]"},{"line_number":95,"context_line":"    if parent_audit_id is not None:"},{"line_number":96,"context_line":"        return [audit_id, parent_audit_id]"},{"line_number":97,"context_line":"    return [audit_id]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_1e9b0868","line":94,"in_reply_to":"1abeadc6_0862f73d","updated":"2014-08-19 23:14:06.000000000","message":"same as previous comment","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"}],"keystone/token/providers/common.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5918e3a7fc4685773d5b8eb9d001185683a11780","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            if not isinstance(expires, six.text_type):"},{"line_number":45,"context_line":"                expires \u003d timeutils.isotime(expires)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        audit_info \u003d provider.audit_info(token_ref.get(\u0027parent_audit_id\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        token_data \u003d token_ref.get(\u0027token_data\u0027)"},{"line_number":50,"context_line":"        if token_data:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_2b432815","line":47,"updated":"2014-08-19 22:34:28.000000000","message":"since generating audit_info is slightly expensive, might want to only generate it if wasn\u0027t able to get it from token_data... move this down after line 53.","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"455c26ba7f14ec52f93fcd38055856b59662c02b","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            if not isinstance(expires, six.text_type):"},{"line_number":45,"context_line":"                expires \u003d timeutils.isotime(expires)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        audit_info \u003d provider.audit_info(token_ref.get(\u0027parent_audit_id\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        token_data \u003d token_ref.get(\u0027token_data\u0027)"},{"line_number":50,"context_line":"        if token_data:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_9eae3884","line":47,"in_reply_to":"1abeadc6_2b432815","updated":"2014-08-19 23:14:06.000000000","message":"done in next","commit_id":"e80d8cbdc1762ae537be0e8c56ce5b4780781bd1"}]}
