)]}'
{"keystonemiddleware/auth_token/__init__.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d68facd494eeed8b4e3e7adcac19e709e64a3d8b","unresolved":false,"context_lines":[{"line_number":644,"context_line":"                self._raise_reject()"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        if request.user_token_valid:"},{"line_number":647,"context_line":"            # Note(knikolla): Token is valid, check roles for this route"},{"line_number":648,"context_line":"            routes \u003d self._identity_server.fetch_routes()"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            route_map \u003d mapper.Mapper()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_9df9234f","line":647,"updated":"2017-04-21 21:02:10.000000000","message":"Good start.  Pull this out to its own function, in its own file under auth_token.","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d11394058b40ab3dee1ee2e5ccb2888e0face5ef","unresolved":false,"context_lines":[{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        if request.user_token_valid:"},{"line_number":647,"context_line":"            # Note(knikolla): Token is valid, check roles for this route"},{"line_number":648,"context_line":"            routes \u003d self._identity_server.fetch_routes()"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            route_map \u003d mapper.Mapper()"},{"line_number":651,"context_line":"            for route in routes:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_3d6c4f07","line":648,"updated":"2017-04-21 21:05:17.000000000","message":"Next iteration, both the routes and the roles need to be cacheable in Memcache. Use the same cache values as for tokens.","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"864e72f65fe5ae176165c5b8000c649b739ffe38","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            route_map \u003d mapper.Mapper()"},{"line_number":651,"context_line":"            for route in routes:"},{"line_number":652,"context_line":"                route_map.connect(route.path,"},{"line_number":653,"context_line":"                                  action\u003droute.role,"},{"line_number":654,"context_line":"                                  conditions\u003ddict(method\u003d[route.verb]))"},{"line_number":655,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_2a598859","line":652,"updated":"2017-04-24 11:57:20.000000000","message":"Need to handle wildcards for both Verbs and paths.  For Verbs,  iterate through the set of http verbs and clone the path.  \n\nThe path wildcards probably need an explicit call after the route_map.match call returns nothing.","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d11394058b40ab3dee1ee2e5ccb2888e0face5ef","unresolved":false,"context_lines":[{"line_number":653,"context_line":"                                  action\u003droute.role,"},{"line_number":654,"context_line":"                                  conditions\u003ddict(method\u003d[route.verb]))"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"            role \u003d route_map.match(request.path_info, request.environ)"},{"line_number":657,"context_line":"            if role and role.id not in request.token_auth.user.role_ids:"},{"line_number":658,"context_line":"                self._raise_reject()"},{"line_number":659,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_7d62d718","line":656,"updated":"2017-04-21 21:05:17.000000000","message":"THis is probably not right.  The route_map does not have the role names in it yet, only the role ides, so we need to fetch those first, and convert them to a map.  \n\nsee the logic on lines 26-27 here https://review.openstack.org/#/c/457818/1/examples/routes/routes_match.py","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"864e72f65fe5ae176165c5b8000c649b739ffe38","unresolved":false,"context_lines":[{"line_number":653,"context_line":"                                  action\u003droute.role,"},{"line_number":654,"context_line":"                                  conditions\u003ddict(method\u003d[route.verb]))"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"            role \u003d route_map.match(request.path_info, request.environ)"},{"line_number":657,"context_line":"            if role and role.id not in request.token_auth.user.role_ids:"},{"line_number":658,"context_line":"                self._raise_reject()"},{"line_number":659,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_0a8feccc","line":656,"in_reply_to":"5ff73747_7d62d718","updated":"2017-04-24 11:57:20.000000000","message":"Ah, I see you put that into the fetch.  OK","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"276fb00cb9195221e214c138e1935b0887c128c0","unresolved":false,"context_lines":[{"line_number":681,"context_line":"            body\u003djsonutils.dumps(body),"},{"line_number":682,"context_line":"            headers\u003dself._reject_auth_headers,"},{"line_number":683,"context_line":"            charset\u003d\u0027UTF-8\u0027,"},{"line_number":684,"context_line":"            content_type\u003d\u0027application/json\u0027)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    def process_response(self, response):"},{"line_number":687,"context_line":"        \"\"\"Process Response."}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_6a1c276a","line":684,"updated":"2017-04-24 15:30:18.000000000","message":"Lonmg term we should select something from the accept headers, but this is sufficient for now","commit_id":"e2503d37de8303d7ae9d17c5f575dd0e2478837b"}],"keystonemiddleware/auth_token/_identity.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d68facd494eeed8b4e3e7adcac19e709e64a3d8b","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return self._client.tokens.get_revoked()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def fetch_routes(self):"},{"line_number":132,"context_line":"        # FIXME(knikolla): Add a configuration option for the type of service"},{"line_number":133,"context_line":"        roles \u003d {role.id: role for role in self._client.roles.list()}"},{"line_number":134,"context_line":"        routes \u003d self._client.routes.list(service\u003d\u0027compute\u0027)"},{"line_number":135,"context_line":"        for route in routes:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_fd8707b6","line":132,"updated":"2017-04-21 21:02:10.000000000","message":"Yep. And make sure service is just a string.  No assumptions that it will be the same as the \"Service\" field for the endpoint.","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"}],"keystonemiddleware/auth_token/_opts.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"276fb00cb9195221e214c138e1935b0887c128c0","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                \u0027 service tokens pass that don\\\u0027t pass the service_token_roles\u0027"},{"line_number":195,"context_line":"                \u0027 check as valid. Setting this true will become the default\u0027"},{"line_number":196,"context_line":"                \u0027 in a future release and should be enabled if possible.\u0027),"},{"line_number":197,"context_line":"    cfg.StrOpt(\u0027service\u0027, default\u003d\u0027\u0027,"},{"line_number":198,"context_line":"               help\u003d\u0027Service type of the protected endpoint.\u0027)"},{"line_number":199,"context_line":"]"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_c73fb6d4","line":197,"updated":"2017-04-24 15:30:18.000000000","message":"Good.  Need another option to enable/disable the RBAC check as well.","commit_id":"e2503d37de8303d7ae9d17c5f575dd0e2478837b"}],"requirements.txt":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d68facd494eeed8b4e3e7adcac19e709e64a3d8b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"six\u003e\u003d1.9.0 # MIT"},{"line_number":18,"context_line":"WebOb\u003e\u003d1.7.1 # MIT"},{"line_number":19,"context_line":"Routes!\u003d2.0,!\u003d2.1,!\u003d2.3.0,\u003e\u003d1.12.3;python_version\u003d\u003d\u00272.7\u0027 # MIT"},{"line_number":20,"context_line":"Routes!\u003d2.0,!\u003d2.3.0,\u003e\u003d1.12.3;python_version!\u003d\u00272.7\u0027 # MIT"}],"source_content_type":"text/plain","patch_set":1,"id":"5ff73747_5dc27beb","line":20,"updated":"2017-04-21 21:02:10.000000000","message":"one line or the other","commit_id":"82af355f63d5d6a41b954e7b1e2a28a6d56f845e"}]}
