)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"982755fd145fa10175392597cf8eca1168e1e166","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"List tokens for memcached backend"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bug 1046905"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: If11d6b87b0a8ae5f8349f1ebb31790e943c70fbf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAALH%2F%2Ffa0%3D","line":9,"updated":"2012-09-06 17:10:25.000000000","message":"Is this bug number correct?  When I click the link I get an error page.","commit_id":"9028d7f978bd79f192e2b0d753126c5c5258eb12"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"57ffb0b6603b47c1e3bb98702da457a443134e29","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"List tokens for memcached backend"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bug 1046905"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: If11d6b87b0a8ae5f8349f1ebb31790e943c70fbf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAALH%2F%2FfZQ%3D","line":9,"in_reply_to":"AAAALH%2F%2Ffa0%3D","updated":"2012-09-06 17:14:39.000000000","message":"It\u0027s correct - bug was listed as a CVE (security issue) - just subscribed you to the bug to so could see it","commit_id":"9028d7f978bd79f192e2b0d753126c5c5258eb12"}],"keystone/token/backends/memcache.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"982755fd145fa10175392597cf8eca1168e1e166","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.client.set(ptk, data_copy, **kwargs)"},{"line_number":70,"context_line":"        if \u0027id\u0027 in data[\u0027user\u0027]:"},{"line_number":71,"context_line":"            user_id \u003d data[\u0027user\u0027][\u0027id\u0027]"},{"line_number":72,"context_line":"            user_record \u003d self.client.get(\u0027usertokens-%s\u0027 % user_id)"},{"line_number":73,"context_line":"            if user_record:"},{"line_number":74,"context_line":"                user_record.append(token_id)"},{"line_number":75,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Ffao%3D","line":72,"updated":"2012-09-06 17:10:25.000000000","message":"There is a race condition between this line and line 77 that could result in 2 or more simultaneous attempts to create a token not having their token ids added to the usertoken entry.  The only way to atomically append to a value is by using memcache\u0027s append() function - see _add_to_revocation_list for an example.","commit_id":"9028d7f978bd79f192e2b0d753126c5c5258eb12"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"982755fd145fa10175392597cf8eca1168e1e166","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        tokens \u003d []"},{"line_number":99,"context_line":"        user_record \u003d self.client.get(\u0027usertokens-%s\u0027 % user_id)"},{"line_number":100,"context_line":"        if not user_record:"},{"line_number":101,"context_line":"            return []"},{"line_number":102,"context_line":"        for token_id in user_record:"},{"line_number":103,"context_line":"            ptk \u003d self._prefix_token_id(token_id)"},{"line_number":104,"context_line":"            token \u003d self.client.get(ptk)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Ffak%3D","line":101,"updated":"2012-09-06 17:10:25.000000000","message":"(Suggestion only) Consider returning \u0027tokens\u0027 instead.","commit_id":"9028d7f978bd79f192e2b0d753126c5c5258eb12"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"982755fd145fa10175392597cf8eca1168e1e166","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            ptk \u003d self._prefix_token_id(token_id)"},{"line_number":104,"context_line":"            token \u003d self.client.get(ptk)"},{"line_number":105,"context_line":"            if token is None:"},{"line_number":106,"context_line":"                user_record.remove(token_id)"},{"line_number":107,"context_line":"            else:"},{"line_number":108,"context_line":"                tokens.append(token_id)"},{"line_number":109,"context_line":"        return tokens"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2FfaY%3D","line":106,"updated":"2012-09-06 17:10:25.000000000","message":"There is no good way to update the memcache entry (and in fact it is not even being attempted), so it\u0027s not clear why this removal is necessary.","commit_id":"9028d7f978bd79f192e2b0d753126c5c5258eb12"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"ab6ab5070157583a6ece65771c447d236a9192b9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        tokens \u003d []"},{"line_number":100,"context_line":"        user_record \u003d self.client.get(\u0027usertokens-%s\u0027 % user_id)"},{"line_number":101,"context_line":"        if not user_record:"},{"line_number":102,"context_line":"            return []"},{"line_number":103,"context_line":"        token_list \u003d jsonutils.loads(\u0027[%s]\u0027 % user_record)"},{"line_number":104,"context_line":"        for token_id in token_list:"},{"line_number":105,"context_line":"            ptk \u003d self._prefix_token_id(token_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FfPc%3D","line":102,"updated":"2012-09-06 19:49:31.000000000","message":"(Suggestion only) Consider returning \u0027tokens\u0027 rather than defining the default value twice.","commit_id":"56b7cde99ddd8a80cb790a301362735f67889bd4"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"279644500ece2f1f385acc115e5ec8ee0164ddd3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        tokens \u003d []"},{"line_number":100,"context_line":"        user_record \u003d self.client.get(\u0027usertokens-%s\u0027 % user_id)"},{"line_number":101,"context_line":"        if not user_record:"},{"line_number":102,"context_line":"            return []"},{"line_number":103,"context_line":"        token_list \u003d jsonutils.loads(\u0027[%s]\u0027 % user_record)"},{"line_number":104,"context_line":"        for token_id in token_list:"},{"line_number":105,"context_line":"            ptk \u003d self._prefix_token_id(token_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FfPU%3D","line":102,"in_reply_to":"AAAALH%2F%2FfPc%3D","updated":"2012-09-06 19:51:36.000000000","message":"+1","commit_id":"56b7cde99ddd8a80cb790a301362735f67889bd4"}],"tests/test_backend.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"ab6ab5070157583a6ece65771c447d236a9192b9","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        self.assertTrue(isinstance(expires, datetime.datetime))"},{"line_number":625,"context_line":"        self.assertEquals(new_data_ref, data)"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        tokens \u003d self.token_api.list_tokens(\u0027testuserid\u0027)"},{"line_number":628,"context_line":"        self.assertEquals(len(tokens), 1)"},{"line_number":629,"context_line":"        self.assertEquals(tokens[0], token_id)"},{"line_number":630,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALH%2F%2FfPg%3D","line":627,"updated":"2012-09-06 19:49:31.000000000","message":"(Suggestion only) Consider testing all 3 token list states - empty, 1 token, more than 1 token.","commit_id":"56b7cde99ddd8a80cb790a301362735f67889bd4"}]}
