)]}'
{"keystoneclient/middleware/auth_token.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":109,"context_line":"HTTP_X_SERVICE_CATALOG"},{"line_number":110,"context_line":"    json encoded keystone service catalog (optional)."},{"line_number":111,"context_line":"    For compatibility reasons this catalog will always be in the V2 catalog"},{"line_number":112,"context_line":"    format even if it is a v3 token."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"HTTP_X_TENANT_ID"},{"line_number":115,"context_line":"    *Deprecated* in favor of HTTP_X_PROJECT_ID"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_ece7b710","line":112,"updated":"2014-05-02 14:00:55.000000000","message":"\"always\" is a strong statement, especially when the v3 catalog provides more flexibility than v2 can express! i think this should be the default behavior, even for v3 deployments, unless a configuration flag opts in to the entirety of the v3 catalog","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":313,"context_line":"               \u0027 not. \"strict\" like \"permissive\" but if the bind type is\u0027"},{"line_number":314,"context_line":"               \u0027 unknown the token will be rejected. \"required\" any form of\u0027"},{"line_number":315,"context_line":"               \u0027 token binding is needed to be allowed. Finally the name of a\u0027"},{"line_number":316,"context_line":"               \u0027 binding method that must be present in tokens.\u0027),"},{"line_number":317,"context_line":"]"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_0c9f7b51","line":316,"updated":"2014-05-02 14:00:55.000000000","message":"suggest:\n\n  enable_v3_catalog\n  default\u003dFalse\n  help\u003dexpose the entirety of the v3 service catalog to the protected service.\n       the protected service must support identity api v3.","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"d8d75f59e7b1a75bd46e112d8a4bdb04a3655b9e","unresolved":false,"context_lines":[{"line_number":313,"context_line":"               \u0027 not. \"strict\" like \"permissive\" but if the bind type is\u0027"},{"line_number":314,"context_line":"               \u0027 unknown the token will be rejected. \"required\" any form of\u0027"},{"line_number":315,"context_line":"               \u0027 token binding is needed to be allowed. Finally the name of a\u0027"},{"line_number":316,"context_line":"               \u0027 binding method that must be present in tokens.\u0027),"},{"line_number":317,"context_line":"]"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_353a9f36","line":316,"in_reply_to":"9ad9bd40_0c9f7b51","updated":"2014-05-04 21:54:11.000000000","message":"But then we are mixing config options with what the code is capable of handling. The problem is that it is difficult to distinguish between v2 and v3 and that certain code will always treat it as v2.\n\nI think what we need to do is look at deprecating the X_SERVICE_CATALOG header in favour of something that might be v2 or v3, or put in a header of X_SERVICE_CATALOG_VERSION.","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":372,"context_line":"    X_SERVICE_CATALOG must be specified in v2 format. If you get a token"},{"line_number":373,"context_line":"    that is in v3 convert it."},{"line_number":374,"context_line":"    \"\"\""},{"line_number":375,"context_line":"    services \u003d []"},{"line_number":376,"context_line":"    for old_service in catalog:"},{"line_number":377,"context_line":"        # first copy over the entries we allow for the service"},{"line_number":378,"context_line":"        new_service \u003d {\u0027type\u0027: old_service[\u0027type\u0027]}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_6cb727d9","line":375,"updated":"2014-05-02 14:00:55.000000000","message":"v2_services ?","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":373,"context_line":"    that is in v3 convert it."},{"line_number":374,"context_line":"    \"\"\""},{"line_number":375,"context_line":"    services \u003d []"},{"line_number":376,"context_line":"    for old_service in catalog:"},{"line_number":377,"context_line":"        # first copy over the entries we allow for the service"},{"line_number":378,"context_line":"        new_service \u003d {\u0027type\u0027: old_service[\u0027type\u0027]}"},{"line_number":379,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_4ca9837a","line":376,"updated":"2014-05-02 14:00:55.000000000","message":"for v3_service in catalog ?","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    services \u003d []"},{"line_number":376,"context_line":"    for old_service in catalog:"},{"line_number":377,"context_line":"        # first copy over the entries we allow for the service"},{"line_number":378,"context_line":"        new_service \u003d {\u0027type\u0027: old_service[\u0027type\u0027]}"},{"line_number":379,"context_line":"        try:"},{"line_number":380,"context_line":"            new_service[\u0027name\u0027] \u003d old_service[\u0027name\u0027]"},{"line_number":381,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_8cbaabbe","line":378,"updated":"2014-05-02 14:00:55.000000000","message":"v2_service","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        # URL not per group we have to collect all the entries of the same"},{"line_number":386,"context_line":"        # region together before adding it to the new service."},{"line_number":387,"context_line":"        regions \u003d {}"},{"line_number":388,"context_line":"        for endpoint in old_service.get(\u0027endpoints\u0027, []):"},{"line_number":389,"context_line":"            region_name \u003d endpoint.get(\u0027region\u0027)"},{"line_number":390,"context_line":"            try:"},{"line_number":391,"context_line":"                region \u003d regions[region_name]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_ccb4b3d3","line":388,"updated":"2014-05-02 14:00:55.000000000","message":"for v3_endpoint in v3_service","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                region \u003d {\u0027region\u0027: region_name} if region_name else {}"},{"line_number":394,"context_line":"                regions[region_name] \u003d region"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"            interface_name \u003d endpoint[\u0027interface\u0027].lower() + \u0027URL\u0027"},{"line_number":397,"context_line":"            region[interface_name] \u003d endpoint[\u0027url\u0027]"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        new_service[\u0027endpoints\u0027] \u003d list(regions.values())"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_ac83ef02","line":396,"updated":"2014-05-02 14:00:55.000000000","message":"should skip URLs with interface types that aren\u0027t in [\u0027public\u0027, \u0027internal\u0027, \u0027admin\u0027] as they\u0027ll break v2 clients","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"d8d75f59e7b1a75bd46e112d8a4bdb04a3655b9e","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                region \u003d {\u0027region\u0027: region_name} if region_name else {}"},{"line_number":394,"context_line":"                regions[region_name] \u003d region"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"            interface_name \u003d endpoint[\u0027interface\u0027].lower() + \u0027URL\u0027"},{"line_number":397,"context_line":"            region[interface_name] \u003d endpoint[\u0027url\u0027]"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        new_service[\u0027endpoints\u0027] \u003d list(regions.values())"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_954a8bc3","line":396,"in_reply_to":"9ad9bd40_ac83ef02","updated":"2014-05-04 21:54:11.000000000","message":"why wouldn\u0027t they just be ignored?","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":394,"context_line":"                regions[region_name] \u003d region"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"            interface_name \u003d endpoint[\u0027interface\u0027].lower() + \u0027URL\u0027"},{"line_number":397,"context_line":"            region[interface_name] \u003d endpoint[\u0027url\u0027]"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        new_service[\u0027endpoints\u0027] \u003d list(regions.values())"},{"line_number":400,"context_line":"        services.append(new_service)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_4cd7c3ed","line":397,"updated":"2014-05-02 14:00:55.000000000","message":"this will arbitrarily stomp on existing endpoints if they have conflicting types - which is allowed in v3. i\u0027m not sure we want to prevent that (?) but the behavior will be unpredictable and should be logged, at least.","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"d8d75f59e7b1a75bd46e112d8a4bdb04a3655b9e","unresolved":false,"context_lines":[{"line_number":394,"context_line":"                regions[region_name] \u003d region"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"            interface_name \u003d endpoint[\u0027interface\u0027].lower() + \u0027URL\u0027"},{"line_number":397,"context_line":"            region[interface_name] \u003d endpoint[\u0027url\u0027]"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        new_service[\u0027endpoints\u0027] \u003d list(regions.values())"},{"line_number":400,"context_line":"        services.append(new_service)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_3511bfac","line":397,"in_reply_to":"9ad9bd40_4cd7c3ed","updated":"2014-05-04 21:54:11.000000000","message":"I\u0027m not following. Regions are defined within v2_service so it should only get overridden if you define multiple URLs per region and interface name combination.","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        if self.include_service_catalog and auth_ref.has_service_catalog():"},{"line_number":950,"context_line":"            catalog \u003d auth_ref.service_catalog.get_data()"},{"line_number":951,"context_line":"            if _token_is_v3(token_info):"},{"line_number":952,"context_line":"                catalog \u003d _v3_to_v2_catalog(catalog)"},{"line_number":953,"context_line":"            rval[\u0027X-Service-Catalog\u0027] \u003d jsonutils.dumps(catalog)"},{"line_number":954,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_8c08eb92","line":951,"updated":"2014-05-02 14:00:55.000000000","message":"if config is true and token_is_v3:","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0e01ec249f5d06c1f56092feae4a209e0fdd289e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"HTTP_X_ROLES"},{"line_number":107,"context_line":"    Comma delimited list of case-sensitive role names"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"HTTP_X_SERVICE_CATALOG"},{"line_number":110,"context_line":"    json encoded keystone service catalog (optional)."},{"line_number":111,"context_line":"    For compatibility reasons this catalog will always be in the V2 catalog"},{"line_number":112,"context_line":"    format even if it is a v3 token."}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_bc08c12e","line":109,"updated":"2014-05-27 00:12:41.000000000","message":"can we have an HTTP_X_V3_SERVICE_CATALOG also?","commit_id":"c1c5669d0c95ca43788abcb3eda07fd3bccec73f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8ab2729454b766e678cfbfb347fb10d64913bda9","unresolved":false,"context_lines":[{"line_number":373,"context_line":"    return timeutils.isotime(at\u003dexpires, subsecond\u003dTrue)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"def _v3_to_v2_catalog(catalog):"},{"line_number":377,"context_line":"    \"\"\"Convert a catalog to v2 format."},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    X_SERVICE_CATALOG must be specified in v2 format. If you get a token"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad9bd40_9b445eb8","line":376,"updated":"2014-05-05 20:42:46.000000000","message":"Can we pull utility code like this out into reusable pieces of the client?","commit_id":"c1c5669d0c95ca43788abcb3eda07fd3bccec73f"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"172596443a506b6edd4f20490ad3efb9cc43ed09","unresolved":false,"context_lines":[{"line_number":373,"context_line":"    return timeutils.isotime(at\u003dexpires, subsecond\u003dTrue)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"def _v3_to_v2_catalog(catalog):"},{"line_number":377,"context_line":"    \"\"\"Convert a catalog to v2 format."},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    X_SERVICE_CATALOG must be specified in v2 format. If you get a token"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_12ac2eed","line":376,"in_reply_to":"9ad9bd40_9b445eb8","updated":"2014-05-07 23:07:52.000000000","message":"I dislike the fact that code like this even exists. The last thing i want to do is give the impression that it should be usable by others.","commit_id":"c1c5669d0c95ca43788abcb3eda07fd3bccec73f"}],"keystoneclient/tests/test_auth_token_middleware.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c0281b05a0f5a4a4e8dd46dc454568f91bd51e16","unresolved":false,"context_lines":[{"line_number":1581,"context_line":"                # no point checking everything, just that it\u0027s in v2 format"},{"line_number":1582,"context_line":"                self.assertIn(\u0027adminURL\u0027, endpoint)"},{"line_number":1583,"context_line":"                self.assertIn(\u0027publicURL\u0027, endpoint)"},{"line_number":1584,"context_line":"                self.assertIn(\u0027adminURL\u0027, endpoint)"},{"line_number":1585,"context_line":""},{"line_number":1586,"context_line":""},{"line_number":1587,"context_line":"class TokenEncodingTest(testtools.TestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_ecf8977e","line":1584,"updated":"2014-05-02 14:00:55.000000000","message":"negative tests would be much appreciated, as that\u0027s where most of the risk is in breaking the underlying service","commit_id":"08cd40192ce3badf9b033725b1cdffec8c7b56df"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0e01ec249f5d06c1f56092feae4a209e0fdd289e","unresolved":false,"context_lines":[{"line_number":1578,"context_line":""},{"line_number":1579,"context_line":"        for service in catalog:"},{"line_number":1580,"context_line":"            for endpoint in service[\u0027endpoints\u0027]:"},{"line_number":1581,"context_line":"                # no point checking everything, just that it\u0027s in v2 format"},{"line_number":1582,"context_line":"                self.assertIn(\u0027adminURL\u0027, endpoint)"},{"line_number":1583,"context_line":"                self.assertIn(\u0027publicURL\u0027, endpoint)"},{"line_number":1584,"context_line":"                self.assertIn(\u0027adminURL\u0027, endpoint)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_5f208f9b","line":1581,"updated":"2014-05-27 00:12:41.000000000","message":"v2 format also has type and name, so check for that.","commit_id":"c1c5669d0c95ca43788abcb3eda07fd3bccec73f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0e01ec249f5d06c1f56092feae4a209e0fdd289e","unresolved":false,"context_lines":[{"line_number":1822,"context_line":"        catalog_data \u003d auth_ref.service_catalog.get_data()"},{"line_number":1823,"context_line":"        catalog \u003d auth_token._v3_to_v2_catalog(catalog_data)"},{"line_number":1824,"context_line":""},{"line_number":1825,"context_line":"        self.assertEqual(1, len(catalog))"},{"line_number":1826,"context_line":"        service \u003d catalog[0]"},{"line_number":1827,"context_line":"        self.assertEqual(1, len(service[\u0027endpoints\u0027]))"},{"line_number":1828,"context_line":"        endpoints \u003d service[\u0027endpoints\u0027][0]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_9f405737","line":1825,"updated":"2014-05-27 00:12:41.000000000","message":"there\u0027s a HasLength matcher which should give nicer output -- http://testtools.readthedocs.org/en/latest/for-test-authors.html#haslength (this applies wherever use this idiom.","commit_id":"c1c5669d0c95ca43788abcb3eda07fd3bccec73f"}]}
