)]}'
{"keystone/access_rules/__init__.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9604e8dd39b2d3b0ba33b10d0abb2916bda45839","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystone.access_rules.core import *  # noqa"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_ef8f02cb","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":48},"updated":"2019-02-19 18:48:01.000000000","message":"NIT: We should stop doing this.","commit_id":"17db4ac215e78f5ea441ad0ff99ee220338e37f6"}],"keystone/access_rules/backends/base.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9604e8dd39b2d3b0ba33b10d0abb2916bda45839","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    @abc.abstractmethod"},{"line_number":26,"context_line":"    def list_access_rules(self, service\u003dNone):"},{"line_number":27,"context_line":"        \"\"\"List access rules.\"\"\""},{"line_number":28,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def check_access_rule(self, service, request_path, request_method,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_ef7dc2b2","line":28,"range":{"start_line":28,"start_character":14,"end_line":28,"end_character":40},"updated":"2019-02-19 18:48:01.000000000","message":"NIT: This should be NotImplementedError() instead of exceptions.NotImplemented() (HTTP Not implemented). This should generate a pure 500 error not a 501. 501 implies the HTTP method is not implemented.","commit_id":"17db4ac215e78f5ea441ad0ff99ee220338e37f6"}],"keystone/access_rules/backends/json.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9604e8dd39b2d3b0ba33b10d0abb2916bda45839","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        ..."},{"line_number":91,"context_line":"    }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The request_path may include a wildcard like \u0027*\u0027 or \u0027**\u0027. A capability"},{"line_number":94,"context_line":"    validation request for a path like \"/v3/users/uuid\" will match with an"},{"line_number":95,"context_line":"    access rule like \"/v3/users/*\", and a request for a path like"},{"line_number":96,"context_line":"    \"/v3/users/uuid/application_credentials/uuid\" will match with an access"},{"line_number":97,"context_line":"    rule like \"/v3/users/**\"."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_af2edaa8","line":97,"range":{"start_line":93,"start_character":1,"end_line":97,"end_character":29},"updated":"2019-02-19 18:48:01.000000000","message":"Does this work for prefix-wildcard matching? NIT: should be part of the docstring.","commit_id":"17db4ac215e78f5ea441ad0ff99ee220338e37f6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0028f7f011e0262d63f30358e6b64d4b75958f60","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        ..."},{"line_number":91,"context_line":"    }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The request_path may include a wildcard like \u0027*\u0027 or \u0027**\u0027. A capability"},{"line_number":94,"context_line":"    validation request for a path like \"/v3/users/uuid\" will match with an"},{"line_number":95,"context_line":"    access rule like \"/v3/users/*\", and a request for a path like"},{"line_number":96,"context_line":"    \"/v3/users/uuid/application_credentials/uuid\" will match with an access"},{"line_number":97,"context_line":"    rule like \"/v3/users/**\"."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_8107d31d","line":97,"range":{"start_line":93,"start_character":1,"end_line":97,"end_character":29},"in_reply_to":"9fdfeff1_01d5231b","updated":"2019-02-24 22:48:11.000000000","message":"Eh, just ignore my question, our url paths are not deep enough to justify: /*/users \nor /**/\u003cuuid\u003e","commit_id":"17db4ac215e78f5ea441ad0ff99ee220338e37f6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ebfcc97b41b76f9ce317feeeb18da8e58bbfe94","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        ..."},{"line_number":91,"context_line":"    }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    The request_path may include a wildcard like \u0027*\u0027 or \u0027**\u0027. A capability"},{"line_number":94,"context_line":"    validation request for a path like \"/v3/users/uuid\" will match with an"},{"line_number":95,"context_line":"    access rule like \"/v3/users/*\", and a request for a path like"},{"line_number":96,"context_line":"    \"/v3/users/uuid/application_credentials/uuid\" will match with an access"},{"line_number":97,"context_line":"    rule like \"/v3/users/**\"."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_01d5231b","line":97,"range":{"start_line":93,"start_character":1,"end_line":97,"end_character":29},"in_reply_to":"9fdfeff1_af2edaa8","updated":"2019-02-24 20:34:22.000000000","message":"By prefix-wildcard do you mean something like the way the paths component is matched as described here\n\nhttps://istio.io/docs/reference/config/authorization/istio.rbac.v1alpha1/#AccessRule\n\n? No, it doesn\u0027t do that.\n\nIs this not already in the docstring? Do you mean as part of the base driver instead of the json driver?","commit_id":"17db4ac215e78f5ea441ad0ff99ee220338e37f6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9604e8dd39b2d3b0ba33b10d0abb2916bda45839","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        if (service in self.access_rules"},{"line_number":155,"context_line":"                and request_method in self.access_rules[service]):"},{"line_number":156,"context_line":"            rules \u003d self.access_rules[service][request_method]"},{"line_number":157,"context_line":"            for rule in rules:"},{"line_number":158,"context_line":"                pattern \u003d r\u0027^%s$\u0027 % rule[\u0027request_path\u0027]"},{"line_number":159,"context_line":"                if (re.match(pattern, request_path)"},{"line_number":160,"context_line":"                        and rule[\u0027allow_chained\u0027] \u003d\u003d allow_chained):"},{"line_number":161,"context_line":"                    return True"},{"line_number":162,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_6b10e550","line":161,"range":{"start_line":157,"start_character":0,"end_line":161,"end_character":31},"updated":"2019-02-19 18:48:01.000000000","message":"NIT: I would probably pre-compile the regular expressions rather than re.match with a raw pattern. We can evaluate the benefits of sacrificing memory for CPU cost later.","commit_id":"17db4ac215e78f5ea441ad0ff99ee220338e37f6"}],"keystone/tests/unit/access_rules_config/backends/test_json.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"45944d99f34956732eb6ed3e0bda046448e5222a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        rules \u003d self.driver.list_access_rules_config()"},{"line_number":34,"context_line":"        self.assertIn(\u0027identity\u0027, rules)"},{"line_number":35,"context_line":"        self.assertIn(\u0027image\u0027, rules)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_list_access_rules_config_for_service(self):"},{"line_number":38,"context_line":"        rules \u003d self.driver.list_access_rules_config(service\u003d\u0027image\u0027)"},{"line_number":39,"context_line":"        self.assertNotIn(\u0027identity\u0027, rules)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_1a4d4199","line":36,"updated":"2019-02-27 16:57:32.000000000","message":"We could add a test to make sure we error out when parsing a bad json file. I attempted to do this manually, but couldn\u0027t get it to work (probably because the manager isn\u0027t wired up yet)?\n\nI haven\u0027t gotten to the other patches in the series yet, so I\u0027m not sure if you\u0027ve added it in a subsequent patch.","commit_id":"73f67d7e5eea88d5dd93759aec8332469c0df20c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"4291abd5620f792d0a9ae2e45f9db0ea06f1fed3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        rules \u003d self.driver.list_access_rules_config()"},{"line_number":34,"context_line":"        self.assertIn(\u0027identity\u0027, rules)"},{"line_number":35,"context_line":"        self.assertIn(\u0027image\u0027, rules)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_list_access_rules_config_for_service(self):"},{"line_number":38,"context_line":"        rules \u003d self.driver.list_access_rules_config(service\u003d\u0027image\u0027)"},{"line_number":39,"context_line":"        self.assertNotIn(\u0027identity\u0027, rules)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_e2ec0bbd","line":36,"in_reply_to":"9fdfeff1_1a4d4199","updated":"2019-03-03 17:33:34.000000000","message":"Done","commit_id":"73f67d7e5eea88d5dd93759aec8332469c0df20c"}]}
