)]}'
{"etc/keystone.conf.sample":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6d9d248ef7793ac14d92c3d6890226494a78a33f","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"# Value to be used when sending tokens to a trusted Horizon host. (string"},{"line_number":701,"context_line":"# value)"},{"line_number":702,"context_line":"#trusted_horizon \u003d http://localhost/"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"[identity]"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"fa81d914_ccf3df71","line":702,"updated":"2015-01-28 11:36:54.000000000","message":"let\u0027s make this a list.","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"# Value to be used when sending tokens to a trusted Horizon host. (string"},{"line_number":701,"context_line":"# value)"},{"line_number":702,"context_line":"#trusted_horizon \u003d http://localhost/"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"[identity]"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"fa81d914_752a9a7f","line":702,"in_reply_to":"fa81d914_ccf3df71","updated":"2015-01-28 21:29:26.000000000","message":"Done","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"3ac4b776c20e6a744130f461bc40f4bdaf2f1c0c","unresolved":false,"context_lines":[{"line_number":689,"context_line":"# A list of trusted dashboard hosts. Before attempting to send tokens back to a"},{"line_number":690,"context_line":"# dashboard host for Single Sign-On, the host must first be a member of this"},{"line_number":691,"context_line":"# list. (multi valued)"},{"line_number":692,"context_line":"#trusted_dashboard \u003d"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"# Location of Single Sign-On callback handler, will return a token to a trusted"},{"line_number":695,"context_line":"# dashboard host. (string value)"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"da86d52c_1e8c067f","line":692,"updated":"2015-02-03 07:56:21.000000000","message":"I would like to see some example, in the comments of this parameters, about how to fill it. for me is not clear which value can I add.","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ea295a0ec8e8fe8b257a4514e0fdbe2a5bea555b","unresolved":false,"context_lines":[{"line_number":689,"context_line":"# A list of trusted dashboard hosts. Before attempting to send tokens back to a"},{"line_number":690,"context_line":"# dashboard host for Single Sign-On, the host must first be a member of this"},{"line_number":691,"context_line":"# list. (multi valued)"},{"line_number":692,"context_line":"#trusted_dashboard \u003d"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"# Location of Single Sign-On callback handler, will return a token to a trusted"},{"line_number":695,"context_line":"# dashboard host. (string value)"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"da86d52c_aa00f901","line":692,"in_reply_to":"da86d52c_1e8c067f","updated":"2015-02-03 17:33:36.000000000","message":"I\u0027ll add an example in config.py.","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"}],"etc/sso_callback_template.html":[{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"3ac4b776c20e6a744130f461bc40f4bdaf2f1c0c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003chtml\u003e"},{"line_number":2,"context_line":"  \u003cbody\u003e"},{"line_number":3,"context_line":"     \u003cform id\u003d\"sso\" name\u003d\"sso\" action\u003d\"$host\" method\u003d\"POST\"\u003e"},{"line_number":4,"context_line":"       Please wait..."}],"source_content_type":"text/html","patch_set":17,"id":"da86d52c_3e38ea9f","line":1,"updated":"2015-02-03 07:56:21.000000000","message":"It would be nice if this HTML web page could pass the HTML Validator (http://validator.w3.org/). I think the work to do is not much and the reward is very good. I can do it, if you want.","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ea295a0ec8e8fe8b257a4514e0fdbe2a5bea555b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003chtml\u003e"},{"line_number":2,"context_line":"  \u003cbody\u003e"},{"line_number":3,"context_line":"     \u003cform id\u003d\"sso\" name\u003d\"sso\" action\u003d\"$host\" method\u003d\"POST\"\u003e"},{"line_number":4,"context_line":"       Please wait..."}],"source_content_type":"text/html","patch_set":17,"id":"da86d52c_6aae0187","line":1,"in_reply_to":"da86d52c_3e38ea9f","updated":"2015-02-03 17:33:36.000000000","message":"done, great suggestion, i made the changes, please review again","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"3ac4b776c20e6a744130f461bc40f4bdaf2f1c0c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"       \u003cbr/\u003e"},{"line_number":6,"context_line":"       \u003cinput type\u003d\"hidden\" name\u003d\"token\" id\u003d\"token\" value\u003d\"$token\"/\u003e"},{"line_number":7,"context_line":"       \u003cnoscript\u003e"},{"line_number":8,"context_line":"         \u003cinput type\u003d\"submit\" name\u003d\"toto\" id\u003d\"toto\""},{"line_number":9,"context_line":"            value\u003d\"If your Javascript is disabled, please click to continue\"/\u003e"},{"line_number":10,"context_line":"       \u003c/noscript\u003e"},{"line_number":11,"context_line":"     \u003c/form\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"da86d52c_1e5166d8","line":8,"updated":"2015-02-03 07:56:21.000000000","message":"I suggest change \"toto\" name and id by, for example, \u0027btn_script_dis\u0027 or \u0027submit_no_javascript\u0027... more suggestions?","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ea295a0ec8e8fe8b257a4514e0fdbe2a5bea555b","unresolved":false,"context_lines":[{"line_number":5,"context_line":"       \u003cbr/\u003e"},{"line_number":6,"context_line":"       \u003cinput type\u003d\"hidden\" name\u003d\"token\" id\u003d\"token\" value\u003d\"$token\"/\u003e"},{"line_number":7,"context_line":"       \u003cnoscript\u003e"},{"line_number":8,"context_line":"         \u003cinput type\u003d\"submit\" name\u003d\"toto\" id\u003d\"toto\""},{"line_number":9,"context_line":"            value\u003d\"If your Javascript is disabled, please click to continue\"/\u003e"},{"line_number":10,"context_line":"       \u003c/noscript\u003e"},{"line_number":11,"context_line":"     \u003c/form\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"da86d52c_aa05597b","line":8,"in_reply_to":"da86d52c_1e5166d8","updated":"2015-02-03 17:33:36.000000000","message":"Done - used submit_no_javascript as id and name","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"}],"keystone/auth/controllers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7945d676695a8dc33f0ee659f00abc200d2702c8","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            self.authenticate(context, auth_info, auth_context)"},{"line_number":374,"context_line":"            if auth_context.get(\u0027access_token_id\u0027):"},{"line_number":375,"context_line":"                auth_info.set_scope(None, auth_context[\u0027project_id\u0027], None)"},{"line_number":376,"context_line":"            #self._check_and_set_default_scoping(auth_info, auth_context)"},{"line_number":377,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"            method_names \u003d auth_info.get_method_names()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_03b80be4","line":376,"updated":"2014-11-21 13:23:26.000000000","message":"This will make the style checks fail. Any reason to not just delete it?","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cf606b0b3254aa723e6607972284ea079f19bce0","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            self.authenticate(context, auth_info, auth_context)"},{"line_number":374,"context_line":"            if auth_context.get(\u0027access_token_id\u0027):"},{"line_number":375,"context_line":"                auth_info.set_scope(None, auth_context[\u0027project_id\u0027], None)"},{"line_number":376,"context_line":"            #self._check_and_set_default_scoping(auth_info, auth_context)"},{"line_number":377,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"            method_names \u003d auth_info.get_method_names()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_1d42233e","line":376,"in_reply_to":"5a890539_03b80be4","updated":"2014-11-21 16:02:50.000000000","message":"oh i can probably revert this change, i thought it was screwing things up, i don\u0027t believe it was","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"}],"keystone/common/config.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6d9d248ef7793ac14d92c3d6890226494a78a33f","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":489,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":490,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":491,"context_line":"        cfg.StrOpt(\u0027trusted_horizon\u0027, default\u003d\u0027http://localhost/\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used when sending tokens to a trusted \u0027"},{"line_number":493,"context_line":"                        \u0027Horizon host.\u0027),"},{"line_number":494,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_0ceed788","line":491,"updated":"2015-01-28 11:36:54.000000000","message":"default should be empty IMO.","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":489,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":490,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":491,"context_line":"        cfg.StrOpt(\u0027trusted_horizon\u0027, default\u003d\u0027http://localhost/\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used when sending tokens to a trusted \u0027"},{"line_number":493,"context_line":"                        \u0027Horizon host.\u0027),"},{"line_number":494,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_9521cea1","line":491,"in_reply_to":"fa81d914_0ceed788","updated":"2015-01-28 21:29:26.000000000","message":"Done","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"1dca613337938e40ce5fc2274579f07da93e57d6","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":489,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":490,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":491,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":492,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":493,"context_line":"                        \u0027trusted dashboard host.\u0027),"},{"line_number":494,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_db02973d","line":491,"range":{"start_line":491,"start_character":29,"end_line":491,"end_character":41},"updated":"2015-01-28 22:14:34.000000000","message":"it\u0027s a nit, but can be fixed: \n\ntrusted_dashboards instead of trusted_dashboard","commit_id":"42cab769b41261fe8bece45c4677a0581c0648ba"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0a7a1a0e01d676fdc49827dbb62c912425573ac9","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":489,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":490,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":491,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":492,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":493,"context_line":"                        \u0027trusted dashboard host.\u0027),"},{"line_number":494,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_c6eb9aae","line":491,"in_reply_to":"fa81d914_db02973d","updated":"2015-01-28 22:25:39.000000000","message":"i think just singular is okay here, cause we do the same for notification_driver\n\n  trusted_dashboard\u003dacme.com\n  trusted_dashboard\u003dbeta.com\n  trusted_dashboard\u003dacme.ca\n\nnotification_driver works the same way.","commit_id":"42cab769b41261fe8bece45c4677a0581c0648ba"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"a88035145619a2a01fd4b20de4e03f6faa876ae3","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":492,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":493,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":494,"context_line":"                        \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":497,"context_line":"                   \u0027return a token to a trusted dashboard host.\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_00baec09","line":494,"updated":"2015-01-29 03:08:00.000000000","message":"This should be:\n\nhelp\u003d\u0027Value to be used when sending tokens to a \u0027\n     \u0027trusted dashboard host.\u0027),","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5eb2ab8007ac75714fd253513a774daa4f1b7921","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":492,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":493,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":494,"context_line":"                        \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":497,"context_line":"                   \u0027return a token to a trusted dashboard host.\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_f41bdac7","line":494,"in_reply_to":"fa81d914_00baec09","updated":"2015-01-29 16:24:41.000000000","message":"Done","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"a88035145619a2a01fd4b20de4e03f6faa876ae3","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                        \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":497,"context_line":"                   \u0027return a token to a trusted dashboard host.\u0027),"},{"line_number":498,"context_line":"    ],"},{"line_number":499,"context_line":"    \u0027policy\u0027: ["},{"line_number":500,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_8045fc18","line":497,"updated":"2015-01-29 03:08:00.000000000","message":"This too.","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5eb2ab8007ac75714fd253513a774daa4f1b7921","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                        \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":497,"context_line":"                   \u0027return a token to a trusted dashboard host.\u0027),"},{"line_number":498,"context_line":"    ],"},{"line_number":499,"context_line":"    \u0027policy\u0027: ["},{"line_number":500,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_d42096f9","line":497,"in_reply_to":"fa81d914_8045fc18","updated":"2015-01-29 16:24:41.000000000","message":"Done","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"189bf3c3ee6264e7e897485f59258f7b63b636d5","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":491,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":492,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":493,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":494,"context_line":"                             \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_e2c05ce2","line":493,"updated":"2015-01-29 17:47:47.000000000","message":"Didn\u0027t get the meaning of this config, as per the controllers.py methods, isn\u0027t this a list of trusted \"origins\" ?","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"726d37f9776bbd35456709e86c7a734f330528d0","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":491,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":492,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":493,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":494,"context_line":"                             \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_854a4ac3","line":493,"in_reply_to":"fa81d914_e2c05ce2","updated":"2015-01-29 18:15:08.000000000","message":"yeah, not sure how to best describe this","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"189bf3c3ee6264e7e897485f59258f7b63b636d5","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":493,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":494,"context_line":"                             \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":497,"context_line":"                        \u0027return a token to a trusted dashboard host.\u0027),"},{"line_number":498,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_426e8830","line":495,"updated":"2015-01-29 17:47:47.000000000","message":"suggestion: name of the config to be \u0027sso_callback_template\u0027","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"726d37f9776bbd35456709e86c7a734f330528d0","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        cfg.MultiStrOpt(\u0027trusted_dashboard\u0027, default\u003d[],"},{"line_number":493,"context_line":"                        help\u003d\u0027Value to be used when sending tokens to a \u0027"},{"line_number":494,"context_line":"                             \u0027trusted dashboard host.\u0027),"},{"line_number":495,"context_line":"        cfg.StrOpt(\u0027sso_callback\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":496,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":497,"context_line":"                        \u0027return a token to a trusted dashboard host.\u0027),"},{"line_number":498,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_85dc0a14","line":495,"in_reply_to":"fa81d914_426e8830","updated":"2015-01-29 18:15:08.000000000","message":"Done","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"dcc96f2005181c1194838b931ec15533f37eddc1","unresolved":false,"context_lines":[{"line_number":509,"context_line":"                             \u0027a member of this list. This option may be \u0027"},{"line_number":510,"context_line":"                             \u0027repeated for multiple values. For example: \u0027"},{"line_number":511,"context_line":"                             \u0027http://horizon.com\u0027),"},{"line_number":512,"context_line":"        cfg.StrOpt(\u0027sso_callback_template\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":513,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"},{"line_number":514,"context_line":"                        \u0027return a token to a trusted dashboard host.\u0027),"},{"line_number":515,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_11755063","line":512,"updated":"2015-02-06 00:36:21.000000000","message":"Nice, thanks for adding this!","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b70818ee74f3e88340bdc8cdc64d968182241f93","unresolved":false,"context_lines":[{"line_number":507,"context_line":"                             \u0027attempting to send tokens back to a dashboard \u0027"},{"line_number":508,"context_line":"                             \u0027host for Single Sign-On, the host must first be \u0027"},{"line_number":509,"context_line":"                             \u0027a member of this list. This option may be \u0027"},{"line_number":510,"context_line":"                             \u0027repeated for multiple values. For example: \u0027"},{"line_number":511,"context_line":"                             \u0027http://horizon.com\u0027),"},{"line_number":512,"context_line":"        cfg.StrOpt(\u0027sso_callback_template\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":513,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_4443a812","line":510,"updated":"2015-02-12 03:26:37.000000000","message":"The phrasing here seems a little strange.  You say that the option may be repeated for multiple values.  My question is,  you may repeat it for multiple values of what???  Are you just trying to say that you can have multiple values of hosts in the list?  Also you end with a sentence that says multiple values. You then say, for example and then give a single value example.","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d2c96e5f012462a5d9a4457e1906b829aed5f20f","unresolved":false,"context_lines":[{"line_number":507,"context_line":"                             \u0027attempting to send tokens back to a dashboard \u0027"},{"line_number":508,"context_line":"                             \u0027host for Single Sign-On, the host must first be \u0027"},{"line_number":509,"context_line":"                             \u0027a member of this list. This option may be \u0027"},{"line_number":510,"context_line":"                             \u0027repeated for multiple values. For example: \u0027"},{"line_number":511,"context_line":"                             \u0027http://horizon.com\u0027),"},{"line_number":512,"context_line":"        cfg.StrOpt(\u0027sso_callback_template\u0027, default\u003d_SSO_CALLBACK,"},{"line_number":513,"context_line":"                   help\u003d\u0027Location of Single Sign-On callback handler, will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_8ebab66f","line":510,"in_reply_to":"da86d52c_4443a812","updated":"2015-02-14 05:56:06.000000000","message":"I tried to make this a bit clearer","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"}],"keystone/contrib/federation/controllers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7945d676695a8dc33f0ee659f00abc200d2702c8","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":266,"context_line":"                                            protocol)"},{"line_number":267,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":268,"context_line":"        from webob import exc"},{"line_number":269,"context_line":"        host \u003d \u0027http://localhost/auth/websso/\u0027"},{"line_number":270,"context_line":"        url \u003d host + \u0027?token\u003d\u0027 + token_id"},{"line_number":271,"context_line":"        return exc.HTTPTemporaryRedirect(location\u003durl)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_23950740","line":268,"updated":"2014-11-21 13:23:26.000000000","message":"Is this here because it\u0027s supposed to be a lazy import?","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f049727fc0a08f89b94c9535085c67c95c3ed16f","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":266,"context_line":"                                            protocol)"},{"line_number":267,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":268,"context_line":"        from webob import exc"},{"line_number":269,"context_line":"        host \u003d \u0027http://localhost/auth/websso/\u0027"},{"line_number":270,"context_line":"        url \u003d host + \u0027?token\u003d\u0027 + token_id"},{"line_number":271,"context_line":"        return exc.HTTPTemporaryRedirect(location\u003durl)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_7d4fa734","line":268,"in_reply_to":"5a890539_1d6943be","updated":"2014-11-21 16:07:10.000000000","message":":-) i\u0027m right there with you","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cf606b0b3254aa723e6607972284ea079f19bce0","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":266,"context_line":"                                            protocol)"},{"line_number":267,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":268,"context_line":"        from webob import exc"},{"line_number":269,"context_line":"        host \u003d \u0027http://localhost/auth/websso/\u0027"},{"line_number":270,"context_line":"        url \u003d host + \u0027?token\u003d\u0027 + token_id"},{"line_number":271,"context_line":"        return exc.HTTPTemporaryRedirect(location\u003durl)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_1d6943be","line":268,"in_reply_to":"5a890539_23950740","updated":"2014-11-21 16:02:50.000000000","message":"lazy developer, not lazy import","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6d9d248ef7793ac14d92c3d6890226494a78a33f","unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        return self.authenticate_for_token(context, auth\u003dauth)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def federated_authentication_from_assertion(self, context, protocol_id):"},{"line_number":261,"context_line":"        # TODO(stevemar): fix this initial part up"},{"line_number":262,"context_line":"        try:"},{"line_number":263,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_ecb6e389","line":260,"updated":"2015-01-28 11:36:54.000000000","message":"need to figure out how to read parameter from URL.","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        return self.authenticate_for_token(context, auth\u003dauth)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def federated_authentication_from_assertion(self, context, protocol_id):"},{"line_number":261,"context_line":"        # TODO(stevemar): fix this initial part up"},{"line_number":262,"context_line":"        try:"},{"line_number":263,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_d526e615","line":260,"in_reply_to":"fa81d914_ecb6e389","updated":"2015-01-28 21:29:26.000000000","message":"Done","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6d9d248ef7793ac14d92c3d6890226494a78a33f","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    def federated_authentication_from_assertion(self, context, protocol_id):"},{"line_number":261,"context_line":"        # TODO(stevemar): fix this initial part up"},{"line_number":262,"context_line":"        try:"},{"line_number":263,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":264,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":265,"context_line":"        except KeyError:"},{"line_number":266,"context_line":"            raise exception.Unauthorized((\u0027Missing parameter \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_ec3b43e9","line":263,"updated":"2015-01-28 11:36:54.000000000","message":"this should be more configurable.","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6d9d248ef7793ac14d92c3d6890226494a78a33f","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        # TODO(stevemar): fix this initial part up"},{"line_number":262,"context_line":"        try:"},{"line_number":263,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":264,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":265,"context_line":"        except KeyError:"},{"line_number":266,"context_line":"            raise exception.Unauthorized((\u0027Missing parameter \u0027"},{"line_number":267,"context_line":"                                          \u0027Shib-Identity-Provider\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_2c255bc2","line":264,"updated":"2015-01-28 11:36:54.000000000","message":"this will require DB lookup. identity_provider id (stored in the DB ~\u003d remote_id)","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        # TODO(stevemar): fix this initial part up"},{"line_number":262,"context_line":"        try:"},{"line_number":263,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":264,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":265,"context_line":"        except KeyError:"},{"line_number":266,"context_line":"            raise exception.Unauthorized((\u0027Missing parameter \u0027"},{"line_number":267,"context_line":"                                          \u0027Shib-Identity-Provider\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_f5684a23","line":264,"in_reply_to":"fa81d914_2c255bc2","updated":"2015-01-28 21:29:26.000000000","message":"coming up in another patch, when I rebase this on marco\u0027s work","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fadb29869ab7ec1a92df5517991fc1152132e687","unresolved":false,"context_lines":[{"line_number":279,"context_line":"\u003chtml\u003e"},{"line_number":280,"context_line":"  \u003cbody\u003e"},{"line_number":281,"context_line":"     \u003cform id\u003d\"sso\" name\u003d\"sso\" action\u003d\"%s\" method\u003d\"POST\"\u003e"},{"line_number":282,"context_line":"       Please wait..."},{"line_number":283,"context_line":"       \u003cbr/\u003e"},{"line_number":284,"context_line":"       \u003cinput type\u003d\"hidden\" name\u003d\"token\" id\u003d\"token\" value\u003d\"%s\"/\u003e"},{"line_number":285,"context_line":"       \u003cnoscript\u003e"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_a3c4e640","line":282,"updated":"2015-01-28 18:05:10.000000000","message":"Make this string translatable","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":279,"context_line":"\u003chtml\u003e"},{"line_number":280,"context_line":"  \u003cbody\u003e"},{"line_number":281,"context_line":"     \u003cform id\u003d\"sso\" name\u003d\"sso\" action\u003d\"%s\" method\u003d\"POST\"\u003e"},{"line_number":282,"context_line":"       Please wait..."},{"line_number":283,"context_line":"       \u003cbr/\u003e"},{"line_number":284,"context_line":"       \u003cinput type\u003d\"hidden\" name\u003d\"token\" id\u003d\"token\" value\u003d\"%s\"/\u003e"},{"line_number":285,"context_line":"       \u003cnoscript\u003e"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_a555c31e","line":282,"in_reply_to":"fa81d914_a3c4e640","updated":"2015-01-28 21:29:26.000000000","message":"i made this a file","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6d9d248ef7793ac14d92c3d6890226494a78a33f","unresolved":false,"context_lines":[{"line_number":293,"context_line":"       }"},{"line_number":294,"context_line":"     \u003c/script\u003e"},{"line_number":295,"context_line":"  \u003c/body\u003e"},{"line_number":296,"context_line":"\u003c/html\u003e"},{"line_number":297,"context_line":"\"\"\" % (CONF.federation.trusted_horizon, auth_ref)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        headers.append((\u0027Content-Type\u0027, \u0027text/html\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_0ca5f752","line":296,"updated":"2015-01-28 11:36:54.000000000","message":"we shouldn\u0027t hardcode JS  here.","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":293,"context_line":"       }"},{"line_number":294,"context_line":"     \u003c/script\u003e"},{"line_number":295,"context_line":"  \u003c/body\u003e"},{"line_number":296,"context_line":"\u003c/html\u003e"},{"line_number":297,"context_line":"\"\"\" % (CONF.federation.trusted_horizon, auth_ref)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        headers.append((\u0027Content-Type\u0027, \u0027text/html\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_b19c2d6b","line":296,"in_reply_to":"fa81d914_0ca5f752","updated":"2015-01-28 21:29:26.000000000","message":"same as above","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fadb29869ab7ec1a92df5517991fc1152132e687","unresolved":false,"context_lines":[{"line_number":294,"context_line":"     \u003c/script\u003e"},{"line_number":295,"context_line":"  \u003c/body\u003e"},{"line_number":296,"context_line":"\u003c/html\u003e"},{"line_number":297,"context_line":"\"\"\" % (CONF.federation.trusted_horizon, auth_ref)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        headers.append((\u0027Content-Type\u0027, \u0027text/html\u0027))"},{"line_number":300,"context_line":"        status \u003d (200, \u0027OK\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_a3adc68a","line":297,"updated":"2015-01-28 18:05:10.000000000","message":"instead of using position argument, it would be more readable to use named argument here","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e645059d53a8fbb0ddd567340f8317c563aa4ec2","unresolved":false,"context_lines":[{"line_number":294,"context_line":"     \u003c/script\u003e"},{"line_number":295,"context_line":"  \u003c/body\u003e"},{"line_number":296,"context_line":"\u003c/html\u003e"},{"line_number":297,"context_line":"\"\"\" % (CONF.federation.trusted_horizon, auth_ref)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        headers.append((\u0027Content-Type\u0027, \u0027text/html\u0027))"},{"line_number":300,"context_line":"        status \u003d (200, \u0027OK\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_053ccfe1","line":297,"in_reply_to":"fa81d914_a3adc68a","updated":"2015-01-28 21:29:26.000000000","message":"same as above","commit_id":"5cfd0789f6230baeeb5c2e355732cd95acd5cb18"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"5be43fef5250ccc51794f1a900287e6d8d0db96b","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        if \u0027origin\u0027 in context[\u0027query_string\u0027]:"},{"line_number":276,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027name\u0027)"},{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.Unauthorized(msg % origin)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_9e62c2ab","line":276,"updated":"2015-01-29 02:22:38.000000000","message":"isn\u0027t the expected query parameter named \"origin\" instead of \"name\"?","commit_id":"42cab769b41261fe8bece45c4677a0581c0648ba"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4391d453807c935b3047f3f4d4a42d30f6e685ab","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        if \u0027origin\u0027 in context[\u0027query_string\u0027]:"},{"line_number":276,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027name\u0027)"},{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.Unauthorized(msg % origin)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_5ee12a99","line":276,"in_reply_to":"fa81d914_9e62c2ab","updated":"2015-01-29 02:36:08.000000000","message":"Done","commit_id":"42cab769b41261fe8bece45c4677a0581c0648ba"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"5be43fef5250ccc51794f1a900287e6d8d0db96b","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        \"\"\"Forms an HTML Form from a template with autosubmit.\"\"\""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        headers \u003d [(\u0027Content-Type\u0027, \u0027text/html\u0027)]"},{"line_number":291,"context_line":"        TEMPLATE_LOCATION \u003d \u0027postback_template.html\u0027"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        with open(TEMPLATE_LOCATION) as template:"},{"line_number":294,"context_line":"            src \u003d string.Template(template.read())"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_dea99ae0","line":291,"updated":"2015-01-29 02:22:38.000000000","message":"how about making the location configurable? would be easier for user to override the template used","commit_id":"42cab769b41261fe8bece45c4677a0581c0648ba"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4391d453807c935b3047f3f4d4a42d30f6e685ab","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        \"\"\"Forms an HTML Form from a template with autosubmit.\"\"\""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        headers \u003d [(\u0027Content-Type\u0027, \u0027text/html\u0027)]"},{"line_number":291,"context_line":"        TEMPLATE_LOCATION \u003d \u0027postback_template.html\u0027"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        with open(TEMPLATE_LOCATION) as template:"},{"line_number":294,"context_line":"            src \u003d string.Template(template.read())"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa81d914_3ee636b5","line":291,"in_reply_to":"fa81d914_dea99ae0","updated":"2015-01-29 02:36:08.000000000","message":"Done","commit_id":"42cab769b41261fe8bece45c4677a0581c0648ba"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"a88035145619a2a01fd4b20de4e03f6faa876ae3","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027origin\u0027)"},{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.Unauthorized(msg % origin)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":282,"context_line":"            return self.render_html_response(origin, token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_60ac88a1","line":279,"updated":"2015-01-29 03:08:00.000000000","message":"This should be\n\nraise exception.Unauthorized(msg)\n\nAnd how about raising exception.ValidationError here?","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5eb2ab8007ac75714fd253513a774daa4f1b7921","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027origin\u0027)"},{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.Unauthorized(msg % origin)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":282,"context_line":"            return self.render_html_response(origin, token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_7410caa8","line":279,"in_reply_to":"fa81d914_60ac88a1","updated":"2015-01-29 16:24:41.000000000","message":"Done","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b8ebfb737861e690d3c9afc3b8daa5d0fb4d56c6","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.Unauthorized(msg % origin)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":282,"context_line":"            return self.render_html_response(origin, token_id)"},{"line_number":283,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_a34bea29","line":280,"updated":"2015-01-29 03:41:34.000000000","message":"I think this will throw an error:  no variable to replace","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5eb2ab8007ac75714fd253513a774daa4f1b7921","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.Unauthorized(msg % origin)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":282,"context_line":"            return self.render_html_response(origin, token_id)"},{"line_number":283,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa81d914_94261e15","line":280,"in_reply_to":"fa81d914_a34bea29","updated":"2015-01-29 16:24:41.000000000","message":"Done","commit_id":"3a59ed9225ca680e7ab0288e5cc1f1e0dcc65f8b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"189bf3c3ee6264e7e897485f59258f7b63b636d5","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        if \u0027origin\u0027 in context[\u0027query_string\u0027]:"},{"line_number":276,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027origin\u0027)"},{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_c296f8ef","line":278,"updated":"2015-01-29 17:47:47.000000000","message":"suggestion: \u0027Request must have an origin query parameter\u0027","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"726d37f9776bbd35456709e86c7a734f330528d0","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        if \u0027origin\u0027 in context[\u0027query_string\u0027]:"},{"line_number":276,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027origin\u0027)"},{"line_number":277,"context_line":"        else:"},{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_c5bd226a","line":278,"in_reply_to":"fa81d914_c296f8ef","updated":"2015-01-29 18:15:08.000000000","message":"Done","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"189bf3c3ee6264e7e897485f59258f7b63b636d5","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":282,"context_line":"            return self.render_html_response(origin, token_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            msg \u003d _(\u0027%s is not a trusted dashboard host\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_e2f21c6e","line":281,"updated":"2015-01-29 17:47:47.000000000","message":"shouldn\u0027t be using oslo_config? (there is a review to change all of the uses of config https://review.openstack.org/#/c/147367/)","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"726d37f9776bbd35456709e86c7a734f330528d0","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            msg \u003d _(\u0027Must have an origin query parameter\u0027)"},{"line_number":279,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":282,"context_line":"            return self.render_html_response(origin, token_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            msg \u003d _(\u0027%s is not a trusted dashboard host\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_a58f4ecb","line":281,"in_reply_to":"fa81d914_e2f21c6e","updated":"2015-01-29 18:15:08.000000000","message":"i\u0027ll rebase it when it\u0027s a conflict","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"4f278ea52e646ee8aa1ffa221a940c1f20a3a339","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    def federated_authentication_from_assertion(self, context, protocol_id):"},{"line_number":263,"context_line":"        # TODO(stevemar): fix this to use remote_entity_id"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":266,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":267,"context_line":"        except KeyError:"},{"line_number":268,"context_line":"            raise exception.Unauthorized((\u0027Missing parameter \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_a502ee08","line":265,"updated":"2015-01-29 18:18:05.000000000","message":"This looks specific to Shibboleth.  This should probably be made configurable.","commit_id":"06fd6770dd1598afe06553e29f90ea5a0c5c0fa4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"60c591e27f076c51da1cb925eb294d04b7606031","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    def federated_authentication_from_assertion(self, context, protocol_id):"},{"line_number":263,"context_line":"        # TODO(stevemar): fix this to use remote_entity_id"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":266,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":267,"context_line":"        except KeyError:"},{"line_number":268,"context_line":"            raise exception.Unauthorized((\u0027Missing parameter \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_b006aecc","line":265,"in_reply_to":"fa81d914_a502ee08","updated":"2015-01-29 18:27:46.000000000","message":"it will be.\nWe are waiting to get things done for https://review.openstack.org/#/c/148229/","commit_id":"06fd6770dd1598afe06553e29f90ea5a0c5c0fa4"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"a1b50257378bdce547b7664abdca9c153fdfe5c3","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    def federated_authentication_from_assertion(self, context, protocol_id):"},{"line_number":263,"context_line":"        # TODO(stevemar): fix this to use remote_entity_id"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            remote_id_name \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":266,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":267,"context_line":"        except KeyError:"},{"line_number":268,"context_line":"            raise exception.Unauthorized((\u0027Missing parameter \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_6bba8724","line":265,"in_reply_to":"fa81d914_b006aecc","updated":"2015-01-29 18:49:06.000000000","message":"Ok, that makes sense.","commit_id":"06fd6770dd1598afe06553e29f90ea5a0c5c0fa4"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"3ac4b776c20e6a744130f461bc40f4bdaf2f1c0c","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            remote_id_name \u003d CONF.federation.remote_id_attribute"},{"line_number":267,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":268,"context_line":"        except KeyError:"},{"line_number":269,"context_line":"            raise exception.Unauthorized(\u0027Missing entity ID from environment\u0027)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":272,"context_line":"                                            protocol_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_3e00ea00","line":269,"updated":"2015-02-03 07:56:21.000000000","message":"Maybe better ?:\n\nmsg \u003d _(\u0027Missing entity ID from environment\u0027)\n\nraise exception.Unauthorized(msg)","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ea295a0ec8e8fe8b257a4514e0fdbe2a5bea555b","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            remote_id_name \u003d CONF.federation.remote_id_attribute"},{"line_number":267,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"},{"line_number":268,"context_line":"        except KeyError:"},{"line_number":269,"context_line":"            raise exception.Unauthorized(\u0027Missing entity ID from environment\u0027)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":272,"context_line":"                                            protocol_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_ea367151","line":269,"in_reply_to":"da86d52c_3e00ea00","updated":"2015-02-03 17:33:36.000000000","message":"Done - fixed all these to be translation compliant","commit_id":"85784a53d5fe63accd55b6e820e62450ce843c11"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc4a67f05e0c4a2a18b363af212c54effb9385b2","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        if \u0027origin\u0027 in context[\u0027query_string\u0027]:"},{"line_number":281,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027origin\u0027)"},{"line_number":282,"context_line":"        else:"},{"line_number":283,"context_line":"            msg \u003d _(\u0027Request must have an origin query parameter\u0027)"},{"line_number":284,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_7b6b0bf1","line":281,"updated":"2015-02-04 16:22:42.000000000","message":"I think we should url-unencode this value, as:\n\n- values in the keystone.conf will be \u0027https://keystone.example.com/something/\u0027\n\n- values passed as a HTTP GET param would be \u0027https%3A//keystone.example.com/something/\u0027","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1b448da0cf0487f17b80196472c627a30295b5b3","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        if \u0027origin\u0027 in context[\u0027query_string\u0027]:"},{"line_number":281,"context_line":"            origin \u003d context[\u0027query_string\u0027].get(\u0027origin\u0027)"},{"line_number":282,"context_line":"        else:"},{"line_number":283,"context_line":"            msg \u003d _(\u0027Request must have an origin query parameter\u0027)"},{"line_number":284,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_283e272a","line":281,"in_reply_to":"da86d52c_7b6b0bf1","updated":"2015-02-09 02:13:15.000000000","message":"Done, I also moved this further up, so we don\u0027t issue a token unnecessarily.","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"dcc96f2005181c1194838b931ec15533f37eddc1","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":288,"context_line":"            return self.render_html_response(origin, token_id)"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"},{"line_number":291,"context_line":"            msg \u003d msg % {\u0027host\u0027: origin}"},{"line_number":292,"context_line":"            LOG.error(msg)"},{"line_number":293,"context_line":"            raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_b1a724bc","line":290,"updated":"2015-02-06 00:36:21.000000000","message":"If we\u0027re using _LE here, should the other error log above be using _LE too?","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1b448da0cf0487f17b80196472c627a30295b5b3","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if origin in CONF.federation.trusted_dashboard:"},{"line_number":288,"context_line":"            return self.render_html_response(origin, token_id)"},{"line_number":289,"context_line":"        else:"},{"line_number":290,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"},{"line_number":291,"context_line":"            msg \u003d msg % {\u0027host\u0027: origin}"},{"line_number":292,"context_line":"            LOG.error(msg)"},{"line_number":293,"context_line":"            raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_a81137b1","line":290,"in_reply_to":"da86d52c_b1a724bc","updated":"2015-02-09 02:13:15.000000000","message":"If I try to use _LE on the others, i get:\n\n./keystone/contrib/federation/controllers.py:274:23: K007 Using hints when _ is necessary\n            LOG.error(msg)\n\nI don\u0027t think it\u0027s necessary if you\u0027re not doing any variable substitution","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc4a67f05e0c4a2a18b363af212c54effb9385b2","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"},{"line_number":291,"context_line":"            msg \u003d msg % {\u0027host\u0027: origin}"},{"line_number":292,"context_line":"            LOG.error(msg)"},{"line_number":293,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def render_html_response(self, host, token_id):"},{"line_number":296,"context_line":"        \"\"\"Forms an HTML Form from a template with autosubmit.\"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_7b586b8a","line":293,"updated":"2015-02-04 16:22:42.000000000","message":"This can be actually even added in a followup patch, but what if we also add a template with HTML code informing user that authentication didn\u0027t work? It\u0027s probably better UX as I am expecting those HTML templates will be changed often.","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1b448da0cf0487f17b80196472c627a30295b5b3","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"},{"line_number":291,"context_line":"            msg \u003d msg % {\u0027host\u0027: origin}"},{"line_number":292,"context_line":"            LOG.error(msg)"},{"line_number":293,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def render_html_response(self, host, token_id):"},{"line_number":296,"context_line":"        \"\"\"Forms an HTML Form from a template with autosubmit.\"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_c8166ba7","line":293,"in_reply_to":"da86d52c_7b586b8a","updated":"2015-02-09 02:13:15.000000000","message":"probably, but like you said, another patch","commit_id":"701e791b6dbb8ca7968a9dc48f31f5dcfe31801c"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b70818ee74f3e88340bdc8cdc64d968182241f93","unresolved":false,"context_lines":[{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        return self.authenticate_for_token(context, auth\u003dauth)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def federated_sso_auth(self, context, protocol_id):"},{"line_number":269,"context_line":"        try:"},{"line_number":270,"context_line":"            remote_id_name \u003d CONF.federation.remote_id_attribute"},{"line_number":271,"context_line":"            identity_provider \u003d context[\u0027environment\u0027][remote_id_name]"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_e44c9ca0","line":268,"updated":"2015-02-12 03:26:37.000000000","message":"This function is very easy to read! nice job!","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"116d1841556b63fbf4f460d9da040ed7f21d6950","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        if host in CONF.federation.trusted_dashboard:"},{"line_number":286,"context_line":"            res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":287,"context_line":"                                                protocol_id)"},{"line_number":288,"context_line":"            token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":289,"context_line":"            return self.render_html_response(host, token_id)"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_a6122460","line":288,"updated":"2015-02-09 19:54:32.000000000","message":"should we prevent from a bug in the response and use res.headers.get(\u0027X-Subject-Token\u0027) instead of accessing it directly?","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"787f442f724d7cbd683e7e80c999995c004d08d2","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        if host in CONF.federation.trusted_dashboard:"},{"line_number":286,"context_line":"            res \u003d self.federated_authentication(context, identity_provider,"},{"line_number":287,"context_line":"                                                protocol_id)"},{"line_number":288,"context_line":"            token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":289,"context_line":"            return self.render_html_response(host, token_id)"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_fa4af025","line":288,"in_reply_to":"da86d52c_a6122460","updated":"2015-02-09 19:55:51.000000000","message":"I think it\u0027s fine, if X-Subject-Token isn\u0027t there then we\u0027re really in trouble :) \n\nAny exceptions that come up during authN should be raised by federated_authentication()","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b70818ee74f3e88340bdc8cdc64d968182241f93","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        headers \u003d [(\u0027Content-Type\u0027, \u0027text/html\u0027)]"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        with open(CONF.federation.sso_callback_template) as template:"},{"line_number":302,"context_line":"            src \u003d string.Template(template.read())"},{"line_number":303,"context_line":"            subs \u003d {\u0027host\u0027: host, \u0027token\u0027: token_id}"},{"line_number":304,"context_line":"            body \u003d src.substitute(subs)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_c47a38b9","line":301,"updated":"2015-02-12 03:26:37.000000000","message":"template substitution approach is very slick!","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"ec098909f0d8ce6abb7236a7e02c3419fc13aa52","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        with open(CONF.federation.sso_callback_template) as template:"},{"line_number":302,"context_line":"            src \u003d string.Template(template.read())"},{"line_number":303,"context_line":"            subs \u003d {\u0027host\u0027: host, \u0027token\u0027: token_id}"},{"line_number":304,"context_line":"            body \u003d src.substitute(subs)"},{"line_number":305,"context_line":"            return webob.Response(body\u003dbody, status\u003d\u0027200\u0027,"},{"line_number":306,"context_line":"                                  headerlist\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da86d52c_01d62c4f","line":303,"updated":"2015-02-18 07:13:57.000000000","message":"(nit): We could close file descriptor as soon as we no longer need it, (this should also make sure buffers are flushed. The code would look like:\nwith open(CONF.federation.sso_callback_template) as template:\n    src \u003d string.Template(template.read())\n\nsubs \u003d {\u0027host\u0027: host, \u0027token\u0027: token_id}\nbody \u003d src.substitute(subs)\nreturn webob.Response(body\u003dbody, status\u003d\u0027200\u0027,\n                      headerlist\u003dheaders)","commit_id":"348bf77dc9b7d081d508837ce90effa98c42c39b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65ff4157582d4334699b776cb7409455f6a4eeee","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        with open(CONF.federation.sso_callback_template) as template:"},{"line_number":302,"context_line":"            src \u003d string.Template(template.read())"},{"line_number":303,"context_line":"            subs \u003d {\u0027host\u0027: host, \u0027token\u0027: token_id}"},{"line_number":304,"context_line":"            body \u003d src.substitute(subs)"},{"line_number":305,"context_line":"            return webob.Response(body\u003dbody, status\u003d\u0027200\u0027,"},{"line_number":306,"context_line":"                                  headerlist\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da86d52c_7c378fe3","line":303,"in_reply_to":"da86d52c_01d62c4f","updated":"2015-02-18 07:35:57.000000000","message":"nice catch!","commit_id":"348bf77dc9b7d081d508837ce90effa98c42c39b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"14ac78d0b5407544cc4dbf2f4a314cb7ef8469ea","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":289,"context_line":"            return self.render_html_response(host, token_id)"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"},{"line_number":292,"context_line":"            msg \u003d msg % {\u0027host\u0027: host}"},{"line_number":293,"context_line":"            LOG.error(msg)"},{"line_number":294,"context_line":"            raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":24,"id":"da86d52c_710a31d3","line":291,"updated":"2015-02-18 23:22:15.000000000","message":"NIT: This probably need to change to _() instead of _LE() because we are also returning the error msg to the user.\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#examples","commit_id":"dc6ac8c4b78d033d44a7cd7465fe93f8fb328c1d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"76f585c2318686dc6ffbf606d3a10b3be1e2c9b5","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            token_id \u003d res.headers[\u0027X-Subject-Token\u0027]"},{"line_number":289,"context_line":"            return self.render_html_response(host, token_id)"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            msg \u003d _LE(\u0027%(host)s is not a trusted dashboard host\u0027)"},{"line_number":292,"context_line":"            msg \u003d msg % {\u0027host\u0027: host}"},{"line_number":293,"context_line":"            LOG.error(msg)"},{"line_number":294,"context_line":"            raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":24,"id":"da86d52c_3b0defe8","line":291,"in_reply_to":"da86d52c_710a31d3","updated":"2015-02-19 04:35:39.000000000","message":"Done","commit_id":"dc6ac8c4b78d033d44a7cd7465fe93f8fb328c1d"}],"keystone/contrib/federation/routers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7945d676695a8dc33f0ee659f00abc200d2702c8","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                resource_name\u003d\u0027identity_provider_protocol_auth\u0027),"},{"line_number":184,"context_line":"            path_vars\u003d{"},{"line_number":185,"context_line":"                \u0027identity_provider\u0027: IDP_ID_PARAMETER_RELATION,"},{"line_number":186,"context_line":"                \u0027protocol\u0027: PROTOCOL_ID_PARAMETER_RELATION})                           "},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # Auth operations"},{"line_number":189,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_839a3b6c","line":186,"updated":"2014-11-21 13:23:26.000000000","message":"Whitespace?","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cf606b0b3254aa723e6607972284ea079f19bce0","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                resource_name\u003d\u0027identity_provider_protocol_auth\u0027),"},{"line_number":184,"context_line":"            path_vars\u003d{"},{"line_number":185,"context_line":"                \u0027identity_provider\u0027: IDP_ID_PARAMETER_RELATION,"},{"line_number":186,"context_line":"                \u0027protocol\u0027: PROTOCOL_ID_PARAMETER_RELATION})                           "},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # Auth operations"},{"line_number":189,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_5d5f4b0f","line":186,"in_reply_to":"5a890539_839a3b6c","updated":"2014-11-21 16:02:50.000000000","message":"Done","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"ba50a97acd2097cda1e6158ead9918dd8a7c3306","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        GET /OS-FEDERATION/saml2/metadata"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        GET/POST /auth/OS-FEDERATION/websso/{protocol}/"},{"line_number":76,"context_line":"                 ?origin\u003dhttps%3A//horizon.example.com"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_82a080a0","line":75,"updated":"2015-01-29 17:35:22.000000000","message":"remove \u0027/\u0027 from the end of the line 75","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"726d37f9776bbd35456709e86c7a734f330528d0","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        GET /OS-FEDERATION/saml2/metadata"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        GET/POST /auth/OS-FEDERATION/websso/{protocol}/"},{"line_number":76,"context_line":"                 ?origin\u003dhttps%3A//horizon.example.com"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa81d914_05b81a75","line":75,"in_reply_to":"fa81d914_82a080a0","updated":"2015-01-29 18:15:08.000000000","message":"Done","commit_id":"637e49a7f86d89b3b264eb3c490a14353f84724b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b70818ee74f3e88340bdc8cdc64d968182241f93","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        POST /auth/OS-FEDERATION/saml2"},{"line_number":78,"context_line":"        GET /OS-FEDERATION/saml2/metadata"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        GET/POST /auth/OS-FEDERATION/websso/{protocol}"},{"line_number":81,"context_line":"                 ?origin\u003dhttps%3A//horizon.example.com"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_0437f0ff","line":80,"updated":"2015-02-12 03:26:37.000000000","message":"Why did you combine your GET/POST into one statement?  If you look at all the other examples you broke the consistency of how these are documented. Would be best to stick with convention","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d2c96e5f012462a5d9a4457e1906b829aed5f20f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        POST /auth/OS-FEDERATION/saml2"},{"line_number":78,"context_line":"        GET /OS-FEDERATION/saml2/metadata"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        GET/POST /auth/OS-FEDERATION/websso/{protocol}"},{"line_number":81,"context_line":"                 ?origin\u003dhttps%3A//horizon.example.com"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_8e9396ff","line":80,"in_reply_to":"da86d52c_0437f0ff","updated":"2015-02-14 05:56:06.000000000","message":"Done","commit_id":"3061d687ded75dad29b4245fd05e19e0375a6271"}],"keystone/tests/test_v3_federation.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"07470483a8e3e623566249ac90707de1287f86e2","unresolved":false,"context_lines":[{"line_number":2579,"context_line":""},{"line_number":2580,"context_line":"    def test_federated_sso_missing_remote_id(self):"},{"line_number":2581,"context_line":"        context \u003d {\u0027environment\u0027: {}}"},{"line_number":2582,"context_line":"        query_string \u003d {\u0027origin\u0027: uuid.uuid4().hex}"},{"line_number":2583,"context_line":"        self._inject_assertion(context, \u0027EMPLOYEE_ASSERTION\u0027, query_string)"},{"line_number":2584,"context_line":"        self.assertRaises(exception.Unauthorized,"},{"line_number":2585,"context_line":"                          self.api.federated_sso_auth,"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_38745067","line":2582,"updated":"2015-02-04 03:38:59.000000000","message":"query_string \u003d {\u0027origin\u0027: self.TRUSTED_DASHBOARD}?","commit_id":"69832dd5b78daa764da14106495eda890fe40424"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ca0c831db7b5717bb19e27a6e5f7027daa2a8e70","unresolved":false,"context_lines":[{"line_number":2579,"context_line":""},{"line_number":2580,"context_line":"    def test_federated_sso_missing_remote_id(self):"},{"line_number":2581,"context_line":"        context \u003d {\u0027environment\u0027: {}}"},{"line_number":2582,"context_line":"        query_string \u003d {\u0027origin\u0027: uuid.uuid4().hex}"},{"line_number":2583,"context_line":"        self._inject_assertion(context, \u0027EMPLOYEE_ASSERTION\u0027, query_string)"},{"line_number":2584,"context_line":"        self.assertRaises(exception.Unauthorized,"},{"line_number":2585,"context_line":"                          self.api.federated_sso_auth,"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_78c6c869","line":2582,"in_reply_to":"da86d52c_38745067","updated":"2015-02-04 03:43:54.000000000","message":"sure, doesn\u0027t really matter, but it\u0027s more consistent.","commit_id":"69832dd5b78daa764da14106495eda890fe40424"}],"keystone/token/providers/common.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7945d676695a8dc33f0ee659f00abc200d2702c8","unresolved":false,"context_lines":[{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def _handle_federation_tokens(self, auth_context, project_id, domain_id):"},{"line_number":462,"context_line":"        user_id \u003d auth_context[\u0027user_id\u0027]"},{"line_number":463,"context_line":"        # NOTE(stevemar): for some reason this method seems to be hit twice,"},{"line_number":464,"context_line":"        # it might be a mis-configuration, in apache, but the second time"},{"line_number":465,"context_line":"        # around the group id values are wiped."},{"line_number":466,"context_line":"        group_ids \u003d [\u00276a5f33cd3ce44fe6aba851a219c8ca60\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_83715b46","line":463,"updated":"2014-11-21 13:23:26.000000000","message":"We should get this figured out!","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cf606b0b3254aa723e6607972284ea079f19bce0","unresolved":false,"context_lines":[{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def _handle_federation_tokens(self, auth_context, project_id, domain_id):"},{"line_number":462,"context_line":"        user_id \u003d auth_context[\u0027user_id\u0027]"},{"line_number":463,"context_line":"        # NOTE(stevemar): for some reason this method seems to be hit twice,"},{"line_number":464,"context_line":"        # it might be a mis-configuration, in apache, but the second time"},{"line_number":465,"context_line":"        # around the group id values are wiped."},{"line_number":466,"context_line":"        group_ids \u003d [\u00276a5f33cd3ce44fe6aba851a219c8ca60\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_3dad1fea","line":463,"in_reply_to":"5a890539_83715b46","updated":"2014-11-21 16:02:50.000000000","message":"yes, for some reason i\u0027m entering this function twice, so many re-directs makes it hard to figure out whats going on","commit_id":"1bcf4a18b10a9b281ad790d22a1e1dd1d3f4b983"}]}
