)]}'
{"keystone/api/_shared/authentication.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ee42ce372dea5a556b9fa388bd564f961fedb2f9","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        raise exception.Unauthorized(tr_msg)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def authenticate_for_token(auth\u003dNone):"},{"line_number":180,"context_line":"    \"\"\"Authenticate user and issue a token.\"\"\""},{"line_number":181,"context_line":"    try:"},{"line_number":182,"context_line":"        auth_info \u003d core.AuthInfo.create(auth\u003dauth)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c97d5a6e","line":179,"updated":"2018-10-07 17:39:36.000000000","message":"Why is this function not just a copyandpaste of http://git.openstack.org/cgit/openstack/keystone/tree/keystone/auth/controllers.py#n57 ?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"992511bacdb1a7c29417986b2dda7cfb6f3770dc","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        raise exception.Unauthorized(tr_msg)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def authenticate_for_token(auth\u003dNone):"},{"line_number":180,"context_line":"    \"\"\"Authenticate user and issue a token.\"\"\""},{"line_number":181,"context_line":"    try:"},{"line_number":182,"context_line":"        auth_info \u003d core.AuthInfo.create(auth\u003dauth)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_e425db17","line":179,"in_reply_to":"3f79a3b5_c4ff7f64","updated":"2018-10-08 00:37:24.000000000","message":"The driving factor was to ensure response creation was isolated to the resource objects instead of in this code path. \n\nWhen we move OS-FEDERATION auth paths to being deprecated here, this code would live in keystone.api.auth instead of in a shared location.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e7f69fb80411ff8f9b9fe1cd6a2fe68aaf1f268b","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        raise exception.Unauthorized(tr_msg)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def authenticate_for_token(auth\u003dNone):"},{"line_number":180,"context_line":"    \"\"\"Authenticate user and issue a token.\"\"\""},{"line_number":181,"context_line":"    try:"},{"line_number":182,"context_line":"        auth_info \u003d core.AuthInfo.create(auth\u003dauth)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c4ff7f64","line":179,"in_reply_to":"3f79a3b5_c97d5a6e","updated":"2018-10-08 00:31:07.000000000","message":"I made an attempt to isolate what I could for what was shared instead of trying to do the complete rendering outside of code on the resource itself.\n\nI can re-add in the \"render\" bits to a response object if that is needed for merging this code.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}],"keystone/api/auth.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"87371b98ff2402125bde177a75ddc38965df6e7d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return a or b"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def _create_base_saml_assertion(auth):"},{"line_number":59,"context_line":"    issuer \u003d CONF.saml.idp_entity_id"},{"line_number":60,"context_line":"    sp_id \u003d auth[\u0027scope\u0027][\u0027service_provider\u0027][\u0027id\u0027]"},{"line_number":61,"context_line":"    service_provider \u003d PROVIDERS.federation_api.get_sp(sp_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c377a0d1","line":58,"updated":"2018-10-04 19:19:38.000000000","message":"Can we put all of our SAML code in a file called _saml.py","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2fa8b804849d3fe366423019f3e582cea90c1382","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return a or b"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def _create_base_saml_assertion(auth):"},{"line_number":59,"context_line":"    issuer \u003d CONF.saml.idp_entity_id"},{"line_number":60,"context_line":"    sp_id \u003d auth[\u0027scope\u0027][\u0027service_provider\u0027][\u0027id\u0027]"},{"line_number":61,"context_line":"    service_provider \u003d PROVIDERS.federation_api.get_sp(sp_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_7bff50b1","line":58,"in_reply_to":"3f79a3b5_c377a0d1","updated":"2018-10-04 20:55:56.000000000","message":"We can. There is no reason it wouldn\u0027t be appropriate to do so, however I\u0027d rather spin that as a followup at this point.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bbefa14bc3be5cc958293da7bbde85482cddb44f","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\"Get possible project scopes for token."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        GET/HEAD /v3/auth/projects"},{"line_number":158,"context_line":"        GET/HEAD /v3/OS-FEDERATION/projects"},{"line_number":159,"context_line":"        \"\"\""},{"line_number":160,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":161,"context_line":"        user_id \u003d self.auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_be3b6bc7","line":158,"range":{"start_line":158,"start_character":0,"end_line":158,"end_character":43},"updated":"2018-10-08 07:26:09.000000000","message":"For this API, there was a deprecated warning in log before , now it\u0027s removed in this patch, could we add it back? or just remove this support directly in S?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4565346810ddec41b2e0e09c6d077eb3a0493f46","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\"Get possible project scopes for token."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        GET/HEAD /v3/auth/projects"},{"line_number":158,"context_line":"        GET/HEAD /v3/OS-FEDERATION/projects"},{"line_number":159,"context_line":"        \"\"\""},{"line_number":160,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":161,"context_line":"        user_id \u003d self.auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c89694a1","line":158,"range":{"start_line":158,"start_character":0,"end_line":158,"end_character":43},"in_reply_to":"3f79a3b5_5931110a","updated":"2018-10-09 08:11:20.000000000","message":"emm, since we won\u0027t remove APIs, it makes sense for me. Thanks.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"11b928a875ce4cab2d30d4d93267ca6967522c20","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\"Get possible project scopes for token."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        GET/HEAD /v3/auth/projects"},{"line_number":158,"context_line":"        GET/HEAD /v3/OS-FEDERATION/projects"},{"line_number":159,"context_line":"        \"\"\""},{"line_number":160,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":161,"context_line":"        user_id \u003d self.auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_5931110a","line":158,"range":{"start_line":158,"start_character":0,"end_line":158,"end_character":43},"in_reply_to":"3f79a3b5_be3b6bc7","updated":"2018-10-08 08:56:16.000000000","message":"Not without a ton of extra introspection. Instead of having separate methods called we now directly wire up routes to ensure we have the same code called in all cases. This means we would need to pull apart the request URI and know what request is deprecated and what is not.\n\nMostly the previous deprecation warning(s) were superfluous. It lets the operator know someone is using the old path. If the code is 100% identical, does it matter? The end user sees no information.\n\nWith v3 we are no longer removing APIs..","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bbefa14bc3be5cc958293da7bbde85482cddb44f","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        \"\"\"Get possible domain scopes for token."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        GET/HEAD /v3/auth/domains"},{"line_number":190,"context_line":"        GET/HEAD /v3/OS-FEDERATION/domains"},{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_domains\u0027)"},{"line_number":193,"context_line":"        user_id \u003d self.auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_de6187d6","line":190,"range":{"start_line":190,"start_character":0,"end_line":190,"end_character":42},"updated":"2018-10-08 07:26:09.000000000","message":"ditto","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"11b928a875ce4cab2d30d4d93267ca6967522c20","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        \"\"\"Get possible domain scopes for token."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        GET/HEAD /v3/auth/domains"},{"line_number":190,"context_line":"        GET/HEAD /v3/OS-FEDERATION/domains"},{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_domains\u0027)"},{"line_number":193,"context_line":"        user_id \u003d self.auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_193b99ea","line":190,"range":{"start_line":190,"start_character":0,"end_line":190,"end_character":42},"in_reply_to":"3f79a3b5_de6187d6","updated":"2018-10-08 08:56:16.000000000","message":"See above","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"87371b98ff2402125bde177a75ddc38965df6e7d","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        include_catalog \u003d \u0027nocatalog\u0027 not in flask.request.args"},{"line_number":327,"context_line":"        token \u003d PROVIDERS.token_provider_api.validate_token("},{"line_number":328,"context_line":"            token_id, window_seconds\u003dwindow_secs)"},{"line_number":329,"context_line":"        token_resp \u003d render_token.render_token_response_from_model("},{"line_number":330,"context_line":"            token, include_catalog\u003dinclude_catalog)"},{"line_number":331,"context_line":"        resp_body \u003d jsonutils.dumps(token_resp)"},{"line_number":332,"context_line":"        response \u003d flask.make_response(resp_body, http_client.OK)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c32560c1","line":329,"updated":"2018-10-04 19:19:38.000000000","message":"Does it make sense to skip this step for a HEAD call?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2fa8b804849d3fe366423019f3e582cea90c1382","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        include_catalog \u003d \u0027nocatalog\u0027 not in flask.request.args"},{"line_number":327,"context_line":"        token \u003d PROVIDERS.token_provider_api.validate_token("},{"line_number":328,"context_line":"            token_id, window_seconds\u003dwindow_secs)"},{"line_number":329,"context_line":"        token_resp \u003d render_token.render_token_response_from_model("},{"line_number":330,"context_line":"            token, include_catalog\u003dinclude_catalog)"},{"line_number":331,"context_line":"        resp_body \u003d jsonutils.dumps(token_resp)"},{"line_number":332,"context_line":"        response \u003d flask.make_response(resp_body, http_client.OK)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_9b2d8c47","line":329,"in_reply_to":"3f79a3b5_c32560c1","updated":"2018-10-04 20:55:56.000000000","message":"Head must do all the same work because content length, etc must remain the same. The only thing different between GET and HEAD is that there is a body (per the spec).\n\nHere we are just letting flask do the head work by calling GET and modifying the response internally. I\u0027d rather not implement HEAD code separately from GET unless it\u0027s explicitly needed (we have one API like that, where the behavior between GET and HEAD was remarkably different)","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}],"keystone/auth/plugins/token.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ee42ce372dea5a556b9fa388bd564f961fedb2f9","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # state in Keystone. To do so is to invite elevation of"},{"line_number":69,"context_line":"        # privilege attacks"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        json_body \u003d flask.request.get_json(silent\u003dTrue, force\u003dTrue) or {}"},{"line_number":72,"context_line":"        project_scoped \u003d \u0027project\u0027 in json_body[\u0027auth\u0027].get("},{"line_number":73,"context_line":"            \u0027scope\u0027, {}"},{"line_number":74,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_8e0a081c","line":71,"updated":"2018-10-07 17:39:36.000000000","message":"This looks like a slight change in behavior. Before this would throw an exception if there was not a valid unicode-encoded JSON body: https://github.com/Pylons/webob/blob/v1.8.2/src/webob/response.py#L587 Now it seems like silent\u003dTrue,force\u003dTrue will let that slide?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a52e48f855cb6f9c67675e606ababff98a646f45","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # state in Keystone. To do so is to invite elevation of"},{"line_number":69,"context_line":"        # privilege attacks"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        json_body \u003d flask.request.get_json(silent\u003dTrue, force\u003dTrue) or {}"},{"line_number":72,"context_line":"        project_scoped \u003d \u0027project\u0027 in json_body[\u0027auth\u0027].get("},{"line_number":73,"context_line":"            \u0027scope\u0027, {}"},{"line_number":74,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_24e74ce6","line":71,"in_reply_to":"3f79a3b5_8e0a081c","updated":"2018-10-08 09:17:31.000000000","message":"This looks to be a minor behavior change\n\nI can add an explicit utf-8 decode (check) here or override the werkzeug request object and use \"as_text\" for the .get_data call.\n\nhttps://github.com/pallets/werkzeug/blob/d129d17066768238139b8f8a5d667d9a4f4d68db/werkzeug/wrappers.py#L517-L518\n\nThe body is less picky this deep into keystone with flask. Ultimately, we do a lot of processing to ensure the body is in-fact JSON higher up in the json_body middleware:\n\nhttps://github.com/openstack/keystone/blob/master/keystone/middleware/core.py\n\nI think this is a very minor change (at worst). I can propose the cleanup followups here shortly.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}],"keystone/common/render_token.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"87371b98ff2402125bde177a75ddc38965df6e7d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3f79a3b5_8e4c6f76","updated":"2018-10-04 19:19:38.000000000","message":"This should not be in common.  If it is flask specific, put it under api/.  Otherwise, put it under token/.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bbefa14bc3be5cc958293da7bbde85482cddb44f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3f79a3b5_ad96e748","in_reply_to":"3f79a3b5_2e173449","updated":"2018-10-08 07:26:09.000000000","message":"and the old one in common/controller.py can be removed as well I guess","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2fa8b804849d3fe366423019f3e582cea90c1382","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3f79a3b5_bb15e8e8","in_reply_to":"3f79a3b5_8e4c6f76","updated":"2018-10-04 20:55:56.000000000","message":"This is the contract for the JSON output of a v3 token. It is not flask specific.\n\nI will happily relocate it (same as with SAML) in a followup if this is a requirement to land the code.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"11b928a875ce4cab2d30d4d93267ca6967522c20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3f79a3b5_f90edd3b","in_reply_to":"3f79a3b5_ad96e748","updated":"2018-10-08 08:56:16.000000000","message":"common/controller (entire file) will be removed in a future patch (when the webob deps are stripped out). This will happen once projects and users are converted over. Until then common controller can remain as is.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ee42ce372dea5a556b9fa388bd564f961fedb2f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3f79a3b5_2e173449","in_reply_to":"3f79a3b5_bb15e8e8","updated":"2018-10-07 17:39:36.000000000","message":"Agreed it doesn\u0027t belong here. From lbragstad\u0027s comment http://git.openstack.org/cgit/openstack/keystone/tree/keystone/common/controller.py#n126 maybe api/ is the right place? (followup is fine with me)","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}],"keystone/identity/core.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ee42ce372dea5a556b9fa388bd564f961fedb2f9","unresolved":false,"context_lines":[{"line_number":903,"context_line":"    # TODO(morgan): The split of \"authenticate\" and \"_authenticate\" is done"},{"line_number":904,"context_line":"    # until user API is converted to flask. This is to make webob and flask"},{"line_number":905,"context_line":"    # play nicely with the authenticate mechanism during self-service password"},{"line_number":906,"context_line":"    # changes. While this is in place, CADF notifications will not be emitted"},{"line_number":907,"context_line":"    # for self-service password changes indicating an auth attempt was being"},{"line_number":908,"context_line":"    # made. This is a very limited time transitional change."},{"line_number":909,"context_line":"    @notifications.emit_event(\u0027authenticate\u0027)"},{"line_number":910,"context_line":"    def authenticate(self, user_id, password):"},{"line_number":911,"context_line":"        return self._authenticate(user_id, password)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_ee229ca6","line":908,"range":{"start_line":906,"start_character":15,"end_line":908,"end_character":60},"updated":"2018-10-07 17:39:36.000000000","message":"uh in that case let\u0027s make sure there is a patch up for the user API before we merge this one? Or why not add the decorator to _authenticate?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"11b928a875ce4cab2d30d4d93267ca6967522c20","unresolved":false,"context_lines":[{"line_number":903,"context_line":"    # TODO(morgan): The split of \"authenticate\" and \"_authenticate\" is done"},{"line_number":904,"context_line":"    # until user API is converted to flask. This is to make webob and flask"},{"line_number":905,"context_line":"    # play nicely with the authenticate mechanism during self-service password"},{"line_number":906,"context_line":"    # changes. While this is in place, CADF notifications will not be emitted"},{"line_number":907,"context_line":"    # for self-service password changes indicating an auth attempt was being"},{"line_number":908,"context_line":"    # made. This is a very limited time transitional change."},{"line_number":909,"context_line":"    @notifications.emit_event(\u0027authenticate\u0027)"},{"line_number":910,"context_line":"    def authenticate(self, user_id, password):"},{"line_number":911,"context_line":"        return self._authenticate(user_id, password)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_041d7061","line":908,"range":{"start_line":906,"start_character":15,"end_line":908,"end_character":60},"in_reply_to":"3f79a3b5_ee229ca6","updated":"2018-10-08 08:56:16.000000000","message":"Either _authenticate or authenticate needs the decorator, the self-service password change calls \"identity_api.authenticate\" and is not a flask-enabled request (doesn\u0027t hit the flask app and therefore does not populate the flask.request or flask.g references). This results in a flask error.\n\nThis is transitional same as the os-federation(flask)-\u003eauth(webob)-\u003eflask(response) was transitional.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}],"keystone/notifications.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ee42ce372dea5a556b9fa388bd564f961fedb2f9","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if oslo_context.domain_id:"},{"line_number":103,"context_line":"        initiator.domain_id \u003d oslo_context.domain_id"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    return initiator"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class Audit(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_898f6275","line":105,"updated":"2018-10-07 17:39:36.000000000","message":"Why did this change need to happen in this patch?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bbefa14bc3be5cc958293da7bbde85482cddb44f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if oslo_context.domain_id:"},{"line_number":103,"context_line":"        initiator.domain_id \u003d oslo_context.domain_id"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    return initiator"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class Audit(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_8a29919d","line":105,"in_reply_to":"3f79a3b5_898f6275","updated":"2018-10-08 07:26:09.000000000","message":"it looks like just a code movement from flask to notifications.\nI think here is better, but it\u0027s good to separate this change to a single patch for easier review.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c7ed17498a440eadf781f028f3995f4015d239f8","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if oslo_context.domain_id:"},{"line_number":103,"context_line":"        initiator.domain_id \u003d oslo_context.domain_id"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    return initiator"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class Audit(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_d9a9a125","line":105,"in_reply_to":"3f79a3b5_8a29919d","updated":"2018-10-08 08:48:32.000000000","message":"This was moved due to circular dependencies when it was in flask. Flask-\u003enotifications-\u003eflask.\n\nIn py3 this wasn\u0027t an issue. It fails spectacularly in py2.7","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}],"keystone/server/flask/core.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bbefa14bc3be5cc958293da7bbde85482cddb44f","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    keystone.server.configure(config_files\u003dconfig_files)"},{"line_number":149,"context_line":"    # explicitly load auth configuration"},{"line_number":150,"context_line":"    keystone.conf.auth.setup_authentication()"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    # Log the options used when starting if we\u0027re in debug mode..."},{"line_number":153,"context_line":"    if CONF.debug:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_73b8acc6","line":150,"updated":"2018-10-08 07:26:09.000000000","message":"this seems unnecessary since it\u0027s just called at L148?","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c7ed17498a440eadf781f028f3995f4015d239f8","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    keystone.server.configure(config_files\u003dconfig_files)"},{"line_number":149,"context_line":"    # explicitly load auth configuration"},{"line_number":150,"context_line":"    keystone.conf.auth.setup_authentication()"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    # Log the options used when starting if we\u0027re in debug mode..."},{"line_number":153,"context_line":"    if CONF.debug:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_3947757d","line":150,"in_reply_to":"3f79a3b5_73b8acc6","updated":"2018-10-08 08:48:32.000000000","message":"There was a bug at one point that forced this. I\u0027ll remove this line in a followup patch.","commit_id":"4e9d7011ebc754178a07079bf1076f7e23109b26"}]}
