)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a4736851be44a85c7b5ecb7ffec703902ccbb853","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Refactor auth_token token cache members to class"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The token cache members are moved from AuthToken to their own"},{"line_number":10,"context_line":"class."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ibf00d39435fa7a6d9a92a9bdfacc3f1b07f890ef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_79323af3","line":10,"updated":"2014-06-03 20:35:00.000000000","message":"Does the relate to a bug or blueprint? Or is this strictly a cleanup/refactor?","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Refactor auth_token token cache members to class"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The token cache members are moved from AuthToken to their own"},{"line_number":10,"context_line":"class."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ibf00d39435fa7a6d9a92a9bdfacc3f1b07f890ef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_6dcf57b4","line":10,"in_reply_to":"1ae5cdf2_79323af3","updated":"2014-06-11 00:55:10.000000000","message":"It\u0027s a refactor. There should be no change in behavior.","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"106f96400f26bd74c54101e69bd40b0e0267978b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Refactor auth_token token cache members to class"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The token cache members are moved from AuthToken to their own"},{"line_number":10,"context_line":"class."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ibf00d39435fa7a6d9a92a9bdfacc3f1b07f890ef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_54a3a94e","line":10,"in_reply_to":"1ae5cdf2_79323af3","updated":"2014-06-10 17:07:16.000000000","message":"probably not, he\u0027s merely moving a bunch of internal stuff around","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"}],"keystoneclient/middleware/auth_token.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a4736851be44a85c7b5ecb7ffec703902ccbb853","unresolved":false,"context_lines":[{"line_number":1333,"context_line":"            self.append(c)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"class TokenCache(object):"},{"line_number":1337,"context_line":"    def __init__(self, conf_get, log):"},{"line_number":1338,"context_line":"        self._conf_get \u003d conf_get"},{"line_number":1339,"context_line":"        self.LOG \u003d log"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_79607acf","line":1336,"updated":"2014-06-03 20:35:00.000000000","message":"doc strings for the class?","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1333,"context_line":"            self.append(c)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"class TokenCache(object):"},{"line_number":1337,"context_line":"    def __init__(self, conf_get, log):"},{"line_number":1338,"context_line":"        self._conf_get \u003d conf_get"},{"line_number":1339,"context_line":"        self.LOG \u003d log"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_8bd6e2ef","line":1336,"in_reply_to":"1ae5cdf2_79607acf","updated":"2014-06-11 00:55:10.000000000","message":"Done","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"efa87b2b386daee0a09c70f3806cf35638170908","unresolved":false,"context_lines":[{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"class TokenCache(object):"},{"line_number":1337,"context_line":"    def __init__(self, conf_get, log):"},{"line_number":1338,"context_line":"        self._conf_get \u003d conf_get"},{"line_number":1339,"context_line":"        self.LOG \u003d log"},{"line_number":1340,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_d5c86057","line":1337,"updated":"2014-06-04 08:04:53.000000000","message":"aesthetically i\u0027d prefer to pass the options in as kwargs that to pass the conf_get function.","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"106f96400f26bd74c54101e69bd40b0e0267978b","unresolved":false,"context_lines":[{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"class TokenCache(object):"},{"line_number":1337,"context_line":"    def __init__(self, conf_get, log):"},{"line_number":1338,"context_line":"        self._conf_get \u003d conf_get"},{"line_number":1339,"context_line":"        self.LOG \u003d log"},{"line_number":1340,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_54f729f5","line":1337,"in_reply_to":"1ae5cdf2_d5c86057","updated":"2014-06-10 17:07:16.000000000","message":"++","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"class TokenCache(object):"},{"line_number":1337,"context_line":"    def __init__(self, conf_get, log):"},{"line_number":1338,"context_line":"        self._conf_get \u003d conf_get"},{"line_number":1339,"context_line":"        self.LOG \u003d log"},{"line_number":1340,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_ab639e18","line":1337,"in_reply_to":"1ae5cdf2_d5c86057","updated":"2014-06-11 00:55:10.000000000","message":"Done","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"efa87b2b386daee0a09c70f3806cf35638170908","unresolved":false,"context_lines":[{"line_number":1357,"context_line":"        if not self._initialized:"},{"line_number":1358,"context_line":"            self._init_cache(env)"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"    def check_user_token(self, user_token):"},{"line_number":1361,"context_line":"        \"\"\"Check if the token is cached already."},{"line_number":1362,"context_line":""},{"line_number":1363,"context_line":"        Returns a tuple. The first element is a list of token IDs, where the"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_9586d8d9","line":1360,"updated":"2014-06-04 08:04:53.000000000","message":"any reason not to call this get() or something more appropriate to a cache interface?","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1357,"context_line":"        if not self._initialized:"},{"line_number":1358,"context_line":"            self._init_cache(env)"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"    def check_user_token(self, user_token):"},{"line_number":1361,"context_line":"        \"\"\"Check if the token is cached already."},{"line_number":1362,"context_line":""},{"line_number":1363,"context_line":"        Returns a tuple. The first element is a list of token IDs, where the"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_8b534238","line":1360,"in_reply_to":"1ae5cdf2_9586d8d9","updated":"2014-06-11 00:55:10.000000000","message":"Done","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a4736851be44a85c7b5ecb7ffec703902ccbb853","unresolved":false,"context_lines":[{"line_number":1390,"context_line":"        cached \u003d self._cache_get(token_id)"},{"line_number":1391,"context_line":"        return ([token_id], cached)"},{"line_number":1392,"context_line":""},{"line_number":1393,"context_line":"    def store(self, token_id, data, expires):"},{"line_number":1394,"context_line":"        \"\"\"Put token data into the cache."},{"line_number":1395,"context_line":""},{"line_number":1396,"context_line":"        Stores the parsed expire date in cache allowing"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_59673ee9","line":1393,"updated":"2014-06-03 20:35:00.000000000","message":"do these public methods need doc strings?","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1390,"context_line":"        cached \u003d self._cache_get(token_id)"},{"line_number":1391,"context_line":"        return ([token_id], cached)"},{"line_number":1392,"context_line":""},{"line_number":1393,"context_line":"    def store(self, token_id, data, expires):"},{"line_number":1394,"context_line":"        \"\"\"Put token data into the cache."},{"line_number":1395,"context_line":""},{"line_number":1396,"context_line":"        Stores the parsed expire date in cache allowing"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_cb4d4a9b","line":1393,"in_reply_to":"1ae5cdf2_59673ee9","updated":"2014-06-11 00:55:10.000000000","message":"This public method has a docstring.","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"efa87b2b386daee0a09c70f3806cf35638170908","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"    def store_invalid(self, token_id):"},{"line_number":1404,"context_line":"        \"\"\"Store invalid token in cache.\"\"\""},{"line_number":1405,"context_line":"        self.LOG.debug(\u0027Marking token as unauthorized in cache\u0027)"},{"line_number":1406,"context_line":"        self._cache_store(token_id, \u0027invalid\u0027)"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _assert_valid_memcache_protection_config(self):"},{"line_number":1409,"context_line":"        if self._memcache_security_strategy:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_1501e805","line":1406,"updated":"2014-06-04 08:04:53.000000000","message":"would love to see \u0027invalid\u0027 as a class variable","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"    def store_invalid(self, token_id):"},{"line_number":1404,"context_line":"        \"\"\"Store invalid token in cache.\"\"\""},{"line_number":1405,"context_line":"        self.LOG.debug(\u0027Marking token as unauthorized in cache\u0027)"},{"line_number":1406,"context_line":"        self._cache_store(token_id, \u0027invalid\u0027)"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def _assert_valid_memcache_protection_config(self):"},{"line_number":1409,"context_line":"        if self._memcache_security_strategy:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_cb1b8a7e","line":1406,"in_reply_to":"1ae5cdf2_1501e805","updated":"2014-06-11 00:55:10.000000000","message":"Done","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"efa87b2b386daee0a09c70f3806cf35638170908","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                         \u0027when a memcache_security_strategy \u0027"},{"line_number":1416,"context_line":"                                         \u0027is defined\u0027)"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":"    def _init_cache(self, env):"},{"line_number":1419,"context_line":"        self._cache_pool \u003d CachePool("},{"line_number":1420,"context_line":"            env.get(self._conf_get(\u0027cache\u0027)),"},{"line_number":1421,"context_line":"            self._conf_get(\u0027memcached_servers\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_55e450e0","line":1418,"updated":"2014-06-04 08:04:53.000000000","message":"becomes part of initialize?\n\nis it expensive? is there any reason to just not create the cache pool in __init__?","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                                         \u0027when a memcache_security_strategy \u0027"},{"line_number":1416,"context_line":"                                         \u0027is defined\u0027)"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":"    def _init_cache(self, env):"},{"line_number":1419,"context_line":"        self._cache_pool \u003d CachePool("},{"line_number":1420,"context_line":"            env.get(self._conf_get(\u0027cache\u0027)),"},{"line_number":1421,"context_line":"            self._conf_get(\u0027memcached_servers\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_6b06f621","line":1418,"in_reply_to":"1ae5cdf2_55e450e0","updated":"2014-06-11 00:55:10.000000000","message":"Done","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"efa87b2b386daee0a09c70f3806cf35638170908","unresolved":false,"context_lines":[{"line_number":1428,"context_line":"        return token only if fresh (not expired)."},{"line_number":1429,"context_line":"        \"\"\""},{"line_number":1430,"context_line":""},{"line_number":1431,"context_line":"        if token_id:"},{"line_number":1432,"context_line":"            if self._memcache_security_strategy is None:"},{"line_number":1433,"context_line":"                key \u003d CACHE_KEY_TEMPLATE % token_id"},{"line_number":1434,"context_line":"                with self._cache_pool.reserve() as cache:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_75e6acb1","line":1431,"updated":"2014-06-04 08:04:53.000000000","message":"short circuit:\n\n    if not token_id: \n        return None\n\nor better move the token_id check into check_user_token","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1428,"context_line":"        return token only if fresh (not expired)."},{"line_number":1429,"context_line":"        \"\"\""},{"line_number":1430,"context_line":""},{"line_number":1431,"context_line":"        if token_id:"},{"line_number":1432,"context_line":"            if self._memcache_security_strategy is None:"},{"line_number":1433,"context_line":"                key \u003d CACHE_KEY_TEMPLATE % token_id"},{"line_number":1434,"context_line":"                with self._cache_pool.reserve() as cache:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_66346dde","line":1431,"in_reply_to":"1ae5cdf2_75e6acb1","updated":"2014-06-11 00:55:10.000000000","message":"Did the short circuit. I\u0027d rather not put the token_id check in (what is now) get() at this point... I\u0027d rather write a test first that verifies that get() works at all with a None token because I expect it doesn\u0027t work anyways.","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"efa87b2b386daee0a09c70f3806cf35638170908","unresolved":false,"context_lines":[{"line_number":1429,"context_line":"        \"\"\""},{"line_number":1430,"context_line":""},{"line_number":1431,"context_line":"        if token_id:"},{"line_number":1432,"context_line":"            if self._memcache_security_strategy is None:"},{"line_number":1433,"context_line":"                key \u003d CACHE_KEY_TEMPLATE % token_id"},{"line_number":1434,"context_line":"                with self._cache_pool.reserve() as cache:"},{"line_number":1435,"context_line":"                    serialized \u003d cache.get(key)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_384fb96c","line":1432,"updated":"2014-06-04 08:04:53.000000000","message":"let\u0027s subclass this with the different strategies - but that can be another patch.","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5b73c841da218490e7b2696409219ea545a64c9","unresolved":false,"context_lines":[{"line_number":1429,"context_line":"        \"\"\""},{"line_number":1430,"context_line":""},{"line_number":1431,"context_line":"        if token_id:"},{"line_number":1432,"context_line":"            if self._memcache_security_strategy is None:"},{"line_number":1433,"context_line":"                key \u003d CACHE_KEY_TEMPLATE % token_id"},{"line_number":1434,"context_line":"                with self._cache_pool.reserve() as cache:"},{"line_number":1435,"context_line":"                    serialized \u003d cache.get(key)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_862fb987","line":1432,"in_reply_to":"1ae5cdf2_384fb96c","updated":"2014-06-11 00:55:10.000000000","message":"I\u0027ll target this for another patch, that\u0027s a bigger refactoring.","commit_id":"0bc22848567f29ccba2c09c7a97371413bea1467"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"b081229dfb0bbc1f53cbd9159bedae7696cb38d7","unresolved":false,"context_lines":[{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        self._assert_valid_memcache_protection_config()"},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"    def initialize(self, env):"},{"line_number":1386,"context_line":"        if self._initialized:"},{"line_number":1387,"context_line":"            return"},{"line_number":1388,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_ab8e392c","line":1385,"updated":"2014-06-11 03:26:15.000000000","message":"I can\u0027t see why we need to do this outside __init__. What\u0027s the purpose of being able to initialize from the first request\u0027s env? \n\nnot this patch though.","commit_id":"8c60f34688360049c8cc4d6920d9262343001b09"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"48b0c3d7a665d6cb0208f6986f18a2420990e4f4","unresolved":false,"context_lines":[{"line_number":1382,"context_line":""},{"line_number":1383,"context_line":"        self._assert_valid_memcache_protection_config()"},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"    def initialize(self, env):"},{"line_number":1386,"context_line":"        if self._initialized:"},{"line_number":1387,"context_line":"            return"},{"line_number":1388,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_67b3599a","line":1385,"in_reply_to":"1ae5cdf2_ab8e392c","updated":"2014-06-12 06:17:34.000000000","message":"Because the cache could be coming from the request env. Request env is not know at __init__().","commit_id":"8c60f34688360049c8cc4d6920d9262343001b09"}]}
