)]}'
{"keystone/identity/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"964989da439935532de886bf77b33576db17f4b3","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        return self.update_user(context, user_id, user)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    def set_user_password(self, context, user_id, user):"},{"line_number":421,"context_line":"        try:"},{"line_number":422,"context_line":"            for token_id in self.token_api.list_tokens(context, user_id):"},{"line_number":423,"context_line":"                self.token_api.delete_token(context, token_id)"},{"line_number":424,"context_line":"        except exception.NotImplemented:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BGs%3D","line":421,"updated":"2012-05-09 16:18:06.000000000","message":"I\u0027d rather this be done only after the user was updated successfully.","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":1926,"name":"Derek Higgins","email":"derekh@redhat.com","username":"derekh"},"change_message_id":"f2dd2546fea54936a470ef4da937ffa6de26c13a","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        return self.update_user(context, user_id, user)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    def set_user_password(self, context, user_id, user):"},{"line_number":421,"context_line":"        try:"},{"line_number":422,"context_line":"            for token_id in self.token_api.list_tokens(context, user_id):"},{"line_number":423,"context_line":"                self.token_api.delete_token(context, token_id)"},{"line_number":424,"context_line":"        except exception.NotImplemented:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BEM%3D","line":421,"in_reply_to":"AAAAHX%2F%2F%2BGs%3D","updated":"2012-05-09 16:48:27.000000000","message":"Done","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"e5fd523c7a66b3a1d5f7b79c9993264f2944e8a2","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            for token_id in self.token_api.list_tokens(context, user_id):"},{"line_number":423,"context_line":"                self.token_api.delete_token(context, token_id)"},{"line_number":424,"context_line":"        except exception.NotImplemented:"},{"line_number":425,"context_line":"            # silently catch this, the password has been changed but tokens"},{"line_number":426,"context_line":"            # remain valid for backends that can\u0027t list tokens for users"},{"line_number":427,"context_line":"            pass"},{"line_number":428,"context_line":"        return self.update_user(context, user_id, user)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BDE%3D","line":425,"updated":"2012-05-09 17:19:19.000000000","message":"Should this state be logged, at least once?  If someone chooses a backend that doesn\u0027t invalidate tokens, it might be useful to have an indication in the logs that this is so.","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"537086aa9cbe18ed79c74745753164f320503052","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        except exception.NotImplemented:"},{"line_number":429,"context_line":"            # The password has been changed but tokens remain valid for"},{"line_number":430,"context_line":"            # backends that can\u0027t list tokens for users"},{"line_number":431,"context_line":"            LOG.warning(\"Password changed for %s, tokens have remained valid\" %"},{"line_number":432,"context_line":"                    user_id)"},{"line_number":433,"context_line":"        return user_ref"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F9Eo%3D","line":431,"updated":"2012-05-11 13:46:24.000000000","message":"use single quotes; also, \"tokens have remained valid\" -\u003e \"but existing tokens remain valid\"","commit_id":"11af0ffe5371e264c9df294ea17431ea7d2f17ba"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"537086aa9cbe18ed79c74745753164f320503052","unresolved":false,"context_lines":[{"line_number":429,"context_line":"            # The password has been changed but tokens remain valid for"},{"line_number":430,"context_line":"            # backends that can\u0027t list tokens for users"},{"line_number":431,"context_line":"            LOG.warning(\"Password changed for %s, tokens have remained valid\" %"},{"line_number":432,"context_line":"                    user_id)"},{"line_number":433,"context_line":"        return user_ref"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def update_user_tenant(self, context, user_id, user):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F9D0%3D","line":432,"updated":"2012-05-11 13:46:24.000000000","message":"indent to match the quotes per https://github.com/openstack/keystone/blob/master/HACKING.rst#calling-methods","commit_id":"11af0ffe5371e264c9df294ea17431ea7d2f17ba"}],"keystone/token/backends/kvs.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"537086aa9cbe18ed79c74745753164f320503052","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        tokens \u003d []"},{"line_number":50,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":51,"context_line":"        for token, user_ref in self.db.items():"},{"line_number":52,"context_line":"            if not token.startswith(\"token-\"):"},{"line_number":53,"context_line":"                continue"},{"line_number":54,"context_line":"            if \"user\" not in user_ref:"},{"line_number":55,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F9Dw%3D","line":52,"updated":"2012-05-11 13:46:24.000000000","message":"use single quotes throughout","commit_id":"11af0ffe5371e264c9df294ea17431ea7d2f17ba"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"964989da439935532de886bf77b33576db17f4b3","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        tokens \u003d []"},{"line_number":88,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":89,"context_line":"        for token_ref in session.query(TokenModel)\\"},{"line_number":90,"context_line":"                                      .filter(TokenModel.expires \u003e now):"},{"line_number":91,"context_line":"            token_ref_dict \u003d token_ref.to_dict()"},{"line_number":92,"context_line":"            if \"user\" not in token_ref_dict:"},{"line_number":93,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BGo%3D","line":90,"updated":"2012-05-09 16:18:06.000000000","message":"Why do we have to get all unexpired tokens, and then walk them in python?","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":1926,"name":"Derek Higgins","email":"derekh@redhat.com","username":"derekh"},"change_message_id":"f2dd2546fea54936a470ef4da937ffa6de26c13a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        tokens \u003d []"},{"line_number":88,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":89,"context_line":"        for token_ref in session.query(TokenModel)\\"},{"line_number":90,"context_line":"                                      .filter(TokenModel.expires \u003e now):"},{"line_number":91,"context_line":"            token_ref_dict \u003d token_ref.to_dict()"},{"line_number":92,"context_line":"            if \"user\" not in token_ref_dict:"},{"line_number":93,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BEc%3D","line":90,"in_reply_to":"AAAAHX%2F%2F%2BGo%3D","updated":"2012-05-09 16:48:27.000000000","message":"I may be missing something but I didn\u0027t think there was need to delete expired tokens and I need to walk them in python to make sure the user_id matches.","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"537086aa9cbe18ed79c74745753164f320503052","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        for token_ref in session.query(TokenModel)\\"},{"line_number":90,"context_line":"                                      .filter(TokenModel.expires \u003e now):"},{"line_number":91,"context_line":"            token_ref_dict \u003d token_ref.to_dict()"},{"line_number":92,"context_line":"            if \"user\" not in token_ref_dict:"},{"line_number":93,"context_line":"                continue"},{"line_number":94,"context_line":"            if token_ref_dict[\"user\"].get(\"id\") !\u003d user_id:"},{"line_number":95,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F9Do%3D","line":92,"updated":"2012-05-11 13:46:24.000000000","message":"single quotes","commit_id":"11af0ffe5371e264c9df294ea17431ea7d2f17ba"}],"keystone/token/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"964989da439935532de886bf77b33576db17f4b3","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :param user_id: identity of the user"},{"line_number":94,"context_line":"        :type user_id: string"},{"line_number":95,"context_line":"        :returns: list."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        \"\"\""},{"line_number":98,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BGk%3D","line":95,"updated":"2012-05-09 16:18:06.000000000","message":"specify list of token_refs or list of token_id\u0027s -- we have both types of calls in various drivers","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":1926,"name":"Derek Higgins","email":"derekh@redhat.com","username":"derekh"},"change_message_id":"f2dd2546fea54936a470ef4da937ffa6de26c13a","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :param user_id: identity of the user"},{"line_number":94,"context_line":"        :type user_id: string"},{"line_number":95,"context_line":"        :returns: list."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        \"\"\""},{"line_number":98,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BEI%3D","line":95,"in_reply_to":"AAAAHX%2F%2F%2BGk%3D","updated":"2012-05-09 16:48:27.000000000","message":"Done","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"}],"tests/test_keystoneclient.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"964989da439935532de886bf77b33576db17f4b3","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                          username\u003d\u0027blah\u0027,"},{"line_number":287,"context_line":"                          password\u003d\u0027blah\u0027)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def test_change_password_clears_tokens(self):"},{"line_number":290,"context_line":"        from keystoneclient import exceptions as client_exceptions"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        client \u003d self.get_client(admin\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BGU%3D","line":289,"updated":"2012-05-09 16:18:06.000000000","message":"Given that it\u0027s really an implementation issue as to how/why tokens become invalid, and the test doesn\u0027t care about that:\n\nSuggestion: test_change_password_invalidates_token\n\nAlso, it only tests that a single token is invalidated, not plural.","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":1926,"name":"Derek Higgins","email":"derekh@redhat.com","username":"derekh"},"change_message_id":"f2dd2546fea54936a470ef4da937ffa6de26c13a","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                          username\u003d\u0027blah\u0027,"},{"line_number":287,"context_line":"                          password\u003d\u0027blah\u0027)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def test_change_password_clears_tokens(self):"},{"line_number":290,"context_line":"        from keystoneclient import exceptions as client_exceptions"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        client \u003d self.get_client(admin\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BEE%3D","line":289,"in_reply_to":"AAAAHX%2F%2F%2BGU%3D","updated":"2012-05-09 16:48:27.000000000","message":"Done","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"964989da439935532de886bf77b33576db17f4b3","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        client \u003d self.get_client(admin\u003dTrue)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        user \u003d client.users.create(name\u003d\"username\", password\u003d\u0027password\u0027,"},{"line_number":295,"context_line":"                                   email\u003d\u0027u@foo.com\u0027)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        token_id \u003d client.tokens.authenticate(username\u003d\"username\","}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BGI%3D","line":294,"updated":"2012-05-09 16:18:06.000000000","message":"Should be single quotes; but personally, I\u0027d rather see all our tests using generated data (uuid\u0027s) to reduce the risk of experiencing confusing test failures when writing new tests.","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":1926,"name":"Derek Higgins","email":"derekh@redhat.com","username":"derekh"},"change_message_id":"f2dd2546fea54936a470ef4da937ffa6de26c13a","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        client \u003d self.get_client(admin\u003dTrue)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        user \u003d client.users.create(name\u003d\"username\", password\u003d\u0027password\u0027,"},{"line_number":295,"context_line":"                                   email\u003d\u0027u@foo.com\u0027)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        token_id \u003d client.tokens.authenticate(username\u003d\"username\","}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BEA%3D","line":294,"in_reply_to":"AAAAHX%2F%2F%2BGI%3D","updated":"2012-05-09 16:48:27.000000000","message":"Done","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"964989da439935532de886bf77b33576db17f4b3","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # authenticate with a token should not work after a password change"},{"line_number":306,"context_line":"        self.assertRaises(client_exceptions.Unauthorized,"},{"line_number":307,"context_line":"                          client.tokens.authenticate, token\u003dtoken_id)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_user_create_update_delete(self):"},{"line_number":310,"context_line":"        from keystoneclient import exceptions as client_exceptions"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BF8%3D","line":307,"updated":"2012-05-09 16:18:06.000000000","message":"Continue line breaking between these args","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"},{"author":{"_account_id":1926,"name":"Derek Higgins","email":"derekh@redhat.com","username":"derekh"},"change_message_id":"f2dd2546fea54936a470ef4da937ffa6de26c13a","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # authenticate with a token should not work after a password change"},{"line_number":306,"context_line":"        self.assertRaises(client_exceptions.Unauthorized,"},{"line_number":307,"context_line":"                          client.tokens.authenticate, token\u003dtoken_id)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_user_create_update_delete(self):"},{"line_number":310,"context_line":"        from keystoneclient import exceptions as client_exceptions"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHX%2F%2F%2BD8%3D","line":307,"in_reply_to":"AAAAHX%2F%2F%2BF8%3D","updated":"2012-05-09 16:48:27.000000000","message":"Done","commit_id":"557fb9b518fc4f3edf59a399bc7e55b5db896927"}]}
