)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"da33e43823425ee8a71df3595d4b9ba62a0b24ee","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Theis code fix the problem to associate one or more IdP with the authentication URL"},{"line_number":10,"context_line":"created using the OS-Federation API. The solution was defined in the bug 1390124."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I857d61e49c3f82ee0b3c50970041ab0fd3f8c7ac"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_97dc351a","line":9,"updated":"2015-01-05 14:55:30.000000000","message":"Typos.  Avoid language like \"This code fixes the problem\" and instead describe what the code actually does in concise form.  Do no refer to the bug report to describe it.","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a81bc81363eece425d75edffbed76dd38e13d74","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Theis code fix the problem to associate one or more IdP with the authentication URL"},{"line_number":10,"context_line":"created using the OS-Federation API. The solution was defined in the bug 1390124."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I857d61e49c3f82ee0b3c50970041ab0fd3f8c7ac"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_a96538e2","line":9,"in_reply_to":"3a961159_97dc351a","updated":"2015-01-06 13:13:09.000000000","message":"++","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3d97a5d33bfcb31e466d8d850ebcddbb96f4c8b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify one or more IDP identifiers for each authentication URL"},{"line_number":10,"context_line":"created using the OS-Federation API. If the identifier is provided during the creation"},{"line_number":11,"context_line":"of the IDP and the parameter to retrieve the IDP ID from the environment is configured"},{"line_number":12,"context_line":"then only the matching IDPs can be used to authenticate against URL. If they are not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3a961159_36648e20","line":9,"updated":"2015-01-13 11:27:41.000000000","message":"the new patch only allows one, I think?","commit_id":"4e7382a6604d9e54edd9ce2241f1cdd02747cb4a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"857ab371081a7b3d25443379f2985f737fba6db6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify one or more IDP identifiers for each authentication URL"},{"line_number":10,"context_line":"created using the OS-Federation API. If the identifier is provided during the creation"},{"line_number":11,"context_line":"of the IDP and the parameter to retrieve the IDP ID from the environment is configured"},{"line_number":12,"context_line":"then only the matching IDPs can be used to authenticate against URL. If they are not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3a961159_79e8c9b3","line":9,"in_reply_to":"3a961159_36648e20","updated":"2015-01-13 11:45:29.000000000","message":"++","commit_id":"4e7382a6604d9e54edd9ce2241f1cdd02747cb4a"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"d2e09e0e9f3395a81a594a9db46e891ba07b7ce6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify one or more IDP identifiers for each authentication URL"},{"line_number":10,"context_line":"created using the OS-Federation API. If the identifier is provided during the creation"},{"line_number":11,"context_line":"of the IDP and the parameter to retrieve the IDP ID from the environment is configured"},{"line_number":12,"context_line":"then only the matching IDPs can be used to authenticate against URL. If they are not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3a961159_99e4950f","line":9,"in_reply_to":"3a961159_36648e20","updated":"2015-01-13 12:00:53.000000000","message":"Done","commit_id":"4e7382a6604d9e54edd9ce2241f1cdd02747cb4a"},{"author":{"_account_id":6534,"name":"David Chadwick","email":"d.w.chadwick@truetrust.co.uk","username":"d-w-chadwick"},"change_message_id":"b1a1a6c2434d29f76647b3fdec7af1fd0b709a9b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify an IDP identifiers for each authentication URL created"},{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If they are not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_fa0d6090","line":9,"updated":"2015-01-14 11:23:50.000000000","message":"an IdP identifier","commit_id":"43b6b635dbaeed30943830d26a3af805982fb80b"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"484a32b66c8c76b976b7162237c9160e65abe9ca","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify an IDP identifiers for each authentication URL created"},{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If they are not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_d5aeb580","line":9,"in_reply_to":"3a961159_fa0d6090","updated":"2015-01-14 11:50:51.000000000","message":"Done","commit_id":"43b6b635dbaeed30943830d26a3af805982fb80b"},{"author":{"_account_id":6534,"name":"David Chadwick","email":"d.w.chadwick@truetrust.co.uk","username":"d-w-chadwick"},"change_message_id":"b1a1a6c2434d29f76647b3fdec7af1fd0b709a9b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch allows to specify an IDP identifiers for each authentication URL created"},{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If they are not"},{"line_number":13,"context_line":"configured then every IDP can authenticate in any URL, preserving the current behaviour."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I857d61e49c3f82ee0b3c50970041ab0fd3f8c7ac"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_1a24ec0c","line":12,"updated":"2015-01-14 11:23:50.000000000","message":"If it is not","commit_id":"43b6b635dbaeed30943830d26a3af805982fb80b"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"484a32b66c8c76b976b7162237c9160e65abe9ca","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch allows to specify an IDP identifiers for each authentication URL created"},{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If they are not"},{"line_number":13,"context_line":"configured then every IDP can authenticate in any URL, preserving the current behaviour."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I857d61e49c3f82ee0b3c50970041ab0fd3f8c7ac"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_35c3793a","line":12,"in_reply_to":"3a961159_1a24ec0c","updated":"2015-01-14 11:50:51.000000000","message":"Done","commit_id":"43b6b635dbaeed30943830d26a3af805982fb80b"},{"author":{"_account_id":6534,"name":"David Chadwick","email":"d.w.chadwick@truetrust.co.uk","username":"d-w-chadwick"},"change_message_id":"b1a1a6c2434d29f76647b3fdec7af1fd0b709a9b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If they are not"},{"line_number":13,"context_line":"configured then every IDP can authenticate in any URL, preserving the current behaviour."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I857d61e49c3f82ee0b3c50970041ab0fd3f8c7ac"},{"line_number":16,"context_line":"Closes-Bug: 1390124"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_5a1e74bc","line":13,"updated":"2015-01-14 11:23:50.000000000","message":"delete, preserving the current behaviour","commit_id":"43b6b635dbaeed30943830d26a3af805982fb80b"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"9ba2a235150aec19faa99f28b45e9b40a02b1506","unresolved":false,"context_lines":[{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If they are not"},{"line_number":13,"context_line":"configured then every IDP can authenticate in any URL, preserving the current behaviour."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I857d61e49c3f82ee0b3c50970041ab0fd3f8c7ac"},{"line_number":16,"context_line":"Closes-Bug: 1390124"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_55d9e520","line":13,"in_reply_to":"3a961159_5a1e74bc","updated":"2015-01-14 11:51:22.000000000","message":"Done","commit_id":"43b6b635dbaeed30943830d26a3af805982fb80b"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"fea4b2db68238adc22eedf7a73eda55010bbe83d","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify an IDP identifier for each authentication URL created"},{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If it is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"3a961159_80b5741a","line":9,"updated":"2015-01-16 13:07:33.000000000","message":"It\u0027s IdP above and IDP here. They mean the same, right?","commit_id":"07974f6d5480672699af8f2f9bca64c0e3e761a6"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0af456f454af0b201308c5312374f553cb1442b0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multiple IdP authentication URL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allows to specify an IDP identifier for each authentication URL created"},{"line_number":10,"context_line":"using the OS-Federation API. If the identifier is provided during the creation of the"},{"line_number":11,"context_line":"IDP and the parameter to retrieve the IDP ID from the environment is configured then"},{"line_number":12,"context_line":"only the matching IDP can be used to authenticate against the URL. If it is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"3a961159_2d203899","line":9,"in_reply_to":"3a961159_80b5741a","updated":"2015-01-16 14:03:26.000000000","message":"They are the same. Fixed!","commit_id":"07974f6d5480672699af8f2f9bca64c0e3e761a6"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ba4f7eb0e204e651d4e8d7943073481eabbc7cce","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"# Value to be used to obtain the entity_id of the"},{"line_number":701,"context_line":"# Identity Provider from the environment. (string value)"},{"line_number":702,"context_line":"#remote_id_attribute\u003d"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"[identity]"},{"line_number":705,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"3a961159_ae17d3ec","line":702,"updated":"2015-01-07 17:24:32.000000000","message":"use `tox - e sample_config` to regenerate this file, rather than editing it.","commit_id":"2b0011eb04e2238bafd2cff13c8ddba1632d21a1"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"04b0d652b08c0b8ca40db8b2cb4bfe5dd12f612f","unresolved":false,"context_lines":[{"line_number":699,"context_line":""},{"line_number":700,"context_line":"# Value to be used to obtain the entity_id of the"},{"line_number":701,"context_line":"# Identity Provider from the environment. (string value)"},{"line_number":702,"context_line":"#remote_id_attribute\u003d"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"[identity]"},{"line_number":705,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"3a961159_415f0b41","line":702,"in_reply_to":"3a961159_ae17d3ec","updated":"2015-01-08 09:54:07.000000000","message":"Done","commit_id":"2b0011eb04e2238bafd2cff13c8ddba1632d21a1"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"94ca6f2ebff442af8d360b6a9caec3b7c30763e3","unresolved":false,"context_lines":[{"line_number":698,"context_line":"#assertion_prefix \u003d"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"# Value to be used to obtain the entity ID of theIdentity Provider from the"},{"line_number":701,"context_line":"# environment. (string value)"},{"line_number":702,"context_line":"#remote_id_attribute \u003d"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":26,"id":"fa81d914_3e0f2c32","line":701,"updated":"2015-01-28 18:52:09.000000000","message":"Do we want to give an example of one here?\n\nFor example, if using the mod_shib plugin, this value is likely `Shib-Identity-Provider`.\n\nThoughts?","commit_id":"9ba37672872accbcf8cc53d1cbcc45dcc6d88a25"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"18beaa979aa454782680a4c3093bc9a6f6829f52","unresolved":false,"context_lines":[{"line_number":698,"context_line":"#assertion_prefix \u003d"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"# Value to be used to obtain the entity ID of theIdentity Provider from the"},{"line_number":701,"context_line":"# environment. (string value)"},{"line_number":702,"context_line":"#remote_id_attribute \u003d"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":26,"id":"fa81d914_586926bd","line":701,"in_reply_to":"fa81d914_3e0f2c32","updated":"2015-01-29 14:50:22.000000000","message":"Done","commit_id":"9ba37672872accbcf8cc53d1cbcc45dcc6d88a25"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"981208964eb0175c1feecd35491ec8dddb5b9ee1","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"# SSL version to use (valid only if SSL enabled). Valid values are TLSv1 and"},{"line_number":299,"context_line":"# SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be available on some"},{"line_number":300,"context_line":"# distributions. (string value)"},{"line_number":301,"context_line":"#kombu_ssl_version \u003d"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"# SSL key file (valid only if SSL enabled). (string value)"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"da86d52c_55ccef35","line":300,"updated":"2015-01-31 01:38:46.000000000","message":"unrelated change?","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"53237e28be25a251ef93b1e2be8f38ccdf8fde4e","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"# SSL version to use (valid only if SSL enabled). Valid values are TLSv1 and"},{"line_number":299,"context_line":"# SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be available on some"},{"line_number":300,"context_line":"# distributions. (string value)"},{"line_number":301,"context_line":"#kombu_ssl_version \u003d"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"# SSL key file (valid only if SSL enabled). (string value)"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"da86d52c_ce6833f8","line":300,"in_reply_to":"da86d52c_55ccef35","updated":"2015-02-02 08:05:23.000000000","message":"i think this was generated by tox -e sample_config and it\u0027s a good thing.","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"981208964eb0175c1feecd35491ec8dddb5b9ee1","unresolved":false,"context_lines":[{"line_number":360,"context_line":"#rpc_zmq_bind_address \u003d *"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"# MatchMaker driver. (string value)"},{"line_number":363,"context_line":"#rpc_zmq_matchmaker \u003d oslo_messaging._drivers.matchmaker.MatchMakerLocalhost"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"# ZeroMQ receiver listening port. (integer value)"},{"line_number":366,"context_line":"#rpc_zmq_port \u003d 9501"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"da86d52c_d5d7ffbd","line":363,"updated":"2015-01-31 01:38:46.000000000","message":"this too.","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"53237e28be25a251ef93b1e2be8f38ccdf8fde4e","unresolved":false,"context_lines":[{"line_number":360,"context_line":"#rpc_zmq_bind_address \u003d *"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"# MatchMaker driver. (string value)"},{"line_number":363,"context_line":"#rpc_zmq_matchmaker \u003d oslo_messaging._drivers.matchmaker.MatchMakerLocalhost"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"# ZeroMQ receiver listening port. (integer value)"},{"line_number":366,"context_line":"#rpc_zmq_port \u003d 9501"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"da86d52c_0e732bea","line":363,"in_reply_to":"da86d52c_d5d7ffbd","updated":"2015-02-02 08:05:23.000000000","message":"i think this was generated by tox -e sample_config and it\u0027s a good thing.","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"981208964eb0175c1feecd35491ec8dddb5b9ee1","unresolved":false,"context_lines":[{"line_number":389,"context_line":"# Heartbeat time-to-live. (integer value)"},{"line_number":390,"context_line":"#matchmaker_heartbeat_ttl \u003d 600"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"# Size of RPC thread pool. (integer value)"},{"line_number":393,"context_line":"#rpc_thread_pool_size \u003d 64"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"# Driver or drivers to handle sending notifications. (multi valued)"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"da86d52c_15e2779f","line":392,"updated":"2015-01-31 01:38:46.000000000","message":"this too.","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"53237e28be25a251ef93b1e2be8f38ccdf8fde4e","unresolved":false,"context_lines":[{"line_number":389,"context_line":"# Heartbeat time-to-live. (integer value)"},{"line_number":390,"context_line":"#matchmaker_heartbeat_ttl \u003d 600"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"# Size of RPC thread pool. (integer value)"},{"line_number":393,"context_line":"#rpc_thread_pool_size \u003d 64"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"# Driver or drivers to handle sending notifications. (multi valued)"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"da86d52c_2e770fd6","line":392,"in_reply_to":"da86d52c_15e2779f","updated":"2015-02-02 08:05:23.000000000","message":"i think this was generated by tox -e sample_config and it\u0027s a good thing.","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"}],"keystone/auth/plugins/mapped.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a222652d8b0cb21dfe12fef7b4fef7ba602f160","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def _apply_mapping_filter(self, identity_provider, protocol, assertion):"},{"line_number":145,"context_line":"        idp \u003d self.federation_api.get_idp(identity_provider)"},{"line_number":146,"context_line":"        if not utils.validate_idp(idp, assertion, protocol):"},{"line_number":147,"context_line":"            raise exception.Unauthorized(_(\"Identity provider and mapping do not match\"))"},{"line_number":148,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":149,"context_line":"            identity_provider, protocol)"},{"line_number":150,"context_line":"        rules \u003d jsonutils.loads(mapping[\u0027rules\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_590cd042","line":147,"updated":"2014-12-18 13:00:52.000000000","message":"Mapping was not used here.\nMaybe update the error message to: \"Identity provider id mismatch\" or something like that.","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"e0ee94178580a993fe7cc8184b3bdb25941d2e29","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def _apply_mapping_filter(self, identity_provider, protocol, assertion):"},{"line_number":145,"context_line":"        idp \u003d self.federation_api.get_idp(identity_provider)"},{"line_number":146,"context_line":"        if not utils.validate_idp(idp, assertion, protocol):"},{"line_number":147,"context_line":"            raise exception.Unauthorized(_(\"Identity provider and mapping do not match\"))"},{"line_number":148,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":149,"context_line":"            identity_provider, protocol)"},{"line_number":150,"context_line":"        rules \u003d jsonutils.loads(mapping[\u0027rules\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_03581231","line":147,"in_reply_to":"3a961159_590cd042","updated":"2014-12-18 16:23:41.000000000","message":"Done","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38c07f375ebdc51d69b4aaa2c17ad4df8110ddca","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def _apply_mapping_filter(self, identity_provider, protocol, assertion):"},{"line_number":145,"context_line":"        idp \u003d self.federation_api.get_idp(identity_provider)"},{"line_number":146,"context_line":"        if not utils.validate_idp(idp, assertion, protocol):"},{"line_number":147,"context_line":"            raise exception.Unauthorized(_(\u0027Identity provider id mismatch\u0027))"},{"line_number":148,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":149,"context_line":"            identity_provider, protocol)"},{"line_number":150,"context_line":"        rules \u003d jsonutils.loads(mapping[\u0027rules\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_d0e7a3e2","line":147,"updated":"2014-12-18 19:05:44.000000000","message":"how about just calling utils.validate_idp and handling the exceptions there?","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"754dd8f328ce33448f8dcb6fd08bd350db0c891d","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def _apply_mapping_filter(self, identity_provider, protocol, assertion):"},{"line_number":145,"context_line":"        idp \u003d self.federation_api.get_idp(identity_provider)"},{"line_number":146,"context_line":"        if not utils.validate_idp(idp, assertion, protocol):"},{"line_number":147,"context_line":"            raise exception.Unauthorized(_(\u0027Identity provider id mismatch\u0027))"},{"line_number":148,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":149,"context_line":"            identity_provider, protocol)"},{"line_number":150,"context_line":"        rules \u003d jsonutils.loads(mapping[\u0027rules\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_d72ea48b","line":147,"in_reply_to":"3a961159_d0e7a3e2","updated":"2014-12-19 15:36:13.000000000","message":"Done","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"}],"keystone/common/config.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"da33e43823425ee8a71df3595d4b9ba62a0b24ee","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":468,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":469,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":470,"context_line":"        cfg.StrOpt(\u0027entity_id_attribute\u0027, default\u003d\u0027\u0027,"},{"line_number":471,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity_id of the\u0027"},{"line_number":472,"context_line":"                        \u0027Identity Provider from the environment.\u0027),"},{"line_number":473,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_97035575","line":470,"updated":"2015-01-05 14:55:30.000000000","message":"idp_id_attribute seems like it would be a more accurate name, or remote_id_attribute if you want it to match the SQL column name.","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"7aba470de9cfed1d2154a38fd91b05c8a68a4b25","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":468,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":469,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":470,"context_line":"        cfg.StrOpt(\u0027entity_id_attribute\u0027, default\u003d\u0027\u0027,"},{"line_number":471,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity_id of the\u0027"},{"line_number":472,"context_line":"                        \u0027Identity Provider from the environment.\u0027),"},{"line_number":473,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_5219bbcf","line":470,"in_reply_to":"3a961159_97035575","updated":"2015-01-07 12:02:29.000000000","message":"Done","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ba4f7eb0e204e651d4e8d7943073481eabbc7cce","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":469,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":470,"context_line":"        cfg.StrOpt(\u0027remote_id_attribute\u0027, default\u003d\u0027\u0027,"},{"line_number":471,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity_id of the\u0027"},{"line_number":472,"context_line":"                        \u0027Identity Provider from the environment.\u0027),"},{"line_number":473,"context_line":"    ],"},{"line_number":474,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_8ee3f703","line":471,"updated":"2015-01-07 17:24:32.000000000","message":"s/entity_id/entity ID ?","commit_id":"2b0011eb04e2238bafd2cff13c8ddba1632d21a1"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"04b0d652b08c0b8ca40db8b2cb4bfe5dd12f612f","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":469,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":470,"context_line":"        cfg.StrOpt(\u0027remote_id_attribute\u0027, default\u003d\u0027\u0027,"},{"line_number":471,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity_id of the\u0027"},{"line_number":472,"context_line":"                        \u0027Identity Provider from the environment.\u0027),"},{"line_number":473,"context_line":"    ],"},{"line_number":474,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_e164774a","line":471,"in_reply_to":"3a961159_8ee3f703","updated":"2015-01-08 09:54:07.000000000","message":"Done","commit_id":"2b0011eb04e2238bafd2cff13c8ddba1632d21a1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","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(\u0027remote_id_attribute\u0027, default\u003d\u0027\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":493,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"},{"line_number":494,"context_line":"                        \u0027using the mod_shib plugin this value is \u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_adc00ce1","line":491,"updated":"2015-01-29 23:01:32.000000000","message":"remove the default. The default should be None rather than an empty string.","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","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(\u0027remote_id_attribute\u0027, default\u003d\u0027\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":493,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"},{"line_number":494,"context_line":"                        \u0027using the mod_shib plugin this value is \u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_081ad5cb","line":491,"in_reply_to":"fa81d914_adc00ce1","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c767ba4915cc2196365b31234737f1f710f0058","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(\u0027remote_id_attribute\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":493,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"},{"line_number":494,"context_line":"                        \u0027using the mod_shib plugin this value is \u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_28078e1a","line":491,"updated":"2015-01-30 16:34:34.000000000","message":"I think brant meant: \n\n  cfg.StrOpt(\u0027remote_id_attribute\u0027, default\u003dNone,","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"672d0261f5162fa6d41e446a77c25aa69a27f8a8","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(\u0027remote_id_attribute\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":493,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"},{"line_number":494,"context_line":"                        \u0027using the mod_shib plugin this value is \u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_592d7394","line":491,"in_reply_to":"fa81d914_0302ab09","updated":"2015-01-30 18:58:17.000000000","message":"Therefore I leave as it is now.","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3796edc2f1f19571875fbe0df5ada1c4fcbe5120","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(\u0027remote_id_attribute\u0027,"},{"line_number":492,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":493,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"},{"line_number":494,"context_line":"                        \u0027using the mod_shib plugin this value is \u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_0302ab09","line":491,"in_reply_to":"fa81d914_28078e1a","updated":"2015-01-30 16:47:58.000000000","message":"I think this is correct as-is. The default for the default parameter is None already.","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"}],"keystone/contrib/federation/controllers.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a222652d8b0cb21dfe12fef7b4fef7ba602f160","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @controller.protected()"},{"line_number":84,"context_line":"    def create_identity_provider(self, context, idp_id, identity_provider):"},{"line_number":85,"context_line":"        identity_provider \u003d self._normalize_dict(identity_provider)"},{"line_number":86,"context_line":"        identity_provider.setdefault(\u0027enabled\u0027, False)"},{"line_number":87,"context_line":"        IdentityProvider.check_immutable_params(identity_provider)"},{"line_number":88,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_94b99d30","line":85,"updated":"2014-12-18 13:00:52.000000000","message":"you may want to set default value for remote_id here","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"e0ee94178580a993fe7cc8184b3bdb25941d2e29","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @controller.protected()"},{"line_number":84,"context_line":"    def create_identity_provider(self, context, idp_id, identity_provider):"},{"line_number":85,"context_line":"        identity_provider \u003d self._normalize_dict(identity_provider)"},{"line_number":86,"context_line":"        identity_provider.setdefault(\u0027enabled\u0027, False)"},{"line_number":87,"context_line":"        IdentityProvider.check_immutable_params(identity_provider)"},{"line_number":88,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_a3b49e35","line":85,"in_reply_to":"3a961159_94b99d30","updated":"2014-12-18 16:23:41.000000000","message":"Actually my idea was that if the remote_id is None (NULL in mysql) then it has no effect and the behavior is like the current implementation where all the idPs allow to authenticate","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"}],"keystone/contrib/federation/migrate_repo/versions/001_add_identity_provider_table.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38c07f375ebdc51d69b4aaa2c17ad4df8110ddca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3a961159_90b6fbda","updated":"2014-12-18 19:05:44.000000000","message":"this should really be a whole new migration script, 004_add_remote_id_column.py\n\nwe typically don\u0027t change the migration scripts once they have shipped in a release","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"754dd8f328ce33448f8dcb6fd08bd350db0c891d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3a961159_d4006204","in_reply_to":"3a961159_90b6fbda","updated":"2014-12-19 15:36:13.000000000","message":"Done","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"}],"keystone/contrib/federation/migrate_repo/versions/004_add_remote_id_column.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dca847125d61b997869403febfd1d07c2e0089f2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"from oslo.db.sqlalchemy import utils"},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_12f9c87f","line":12,"updated":"2015-01-08 16:05:11.000000000","message":"add a new line above here","commit_id":"49c2c5fa0f91910aef2166a51f0cd0e92a6b7184"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"265366c521b1ad2ffd55a94e9b648f2614ea25e6","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"from oslo.db.sqlalchemy import utils"},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_3bcbea1e","line":12,"in_reply_to":"3a961159_12f9c87f","updated":"2015-01-12 16:16:06.000000000","message":"Done","commit_id":"49c2c5fa0f91910aef2166a51f0cd0e92a6b7184"}],"keystone/contrib/federation/utils.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a222652d8b0cb21dfe12fef7b4fef7ba602f160","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def validate_idp(idp, assertion, protocol):"},{"line_number":125,"context_line":"    idp_remote_identifier \u003d None "},{"line_number":126,"context_line":"    if protocol\u003d\u003d\"saml2\":"},{"line_number":127,"context_line":"        idp_remote_identifier \u003d assertion[\u0027Shib-Identity-Provider\u0027]"},{"line_number":128,"context_line":"        if not idp_remote_identifier:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_79218cfb","line":125,"updated":"2014-12-18 13:00:52.000000000","message":"trailing whitespace.\nI think running \n# tox -epep8 \n\nshould catch such nits.","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"e0ee94178580a993fe7cc8184b3bdb25941d2e29","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def validate_idp(idp, assertion, protocol):"},{"line_number":125,"context_line":"    idp_remote_identifier \u003d None "},{"line_number":126,"context_line":"    if protocol\u003d\u003d\"saml2\":"},{"line_number":127,"context_line":"        idp_remote_identifier \u003d assertion[\u0027Shib-Identity-Provider\u0027]"},{"line_number":128,"context_line":"        if not idp_remote_identifier:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_6391d699","line":125,"in_reply_to":"3a961159_79218cfb","updated":"2014-12-18 16:23:41.000000000","message":"Done","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a222652d8b0cb21dfe12fef7b4fef7ba602f160","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def validate_idp(idp, assertion, protocol):"},{"line_number":125,"context_line":"    idp_remote_identifier \u003d None "},{"line_number":126,"context_line":"    if protocol\u003d\u003d\"saml2\":"},{"line_number":127,"context_line":"        idp_remote_identifier \u003d assertion[\u0027Shib-Identity-Provider\u0027]"},{"line_number":128,"context_line":"        if not idp_remote_identifier:"},{"line_number":129,"context_line":"            raise exception.ValidationError(\"Identity provider identifier not accessible\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_595e9046","line":126,"updated":"2014-12-18 13:00:52.000000000","message":"again, since we gave lots of liberty in naming protocols now making users to use \u0027saml2\u0027 name is not the best idea. I was thinking, that the protocol name should also be specified in the configuation file.","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"e0ee94178580a993fe7cc8184b3bdb25941d2e29","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def validate_idp(idp, assertion, protocol):"},{"line_number":125,"context_line":"    idp_remote_identifier \u003d None "},{"line_number":126,"context_line":"    if protocol\u003d\u003d\"saml2\":"},{"line_number":127,"context_line":"        idp_remote_identifier \u003d assertion[\u0027Shib-Identity-Provider\u0027]"},{"line_number":128,"context_line":"        if not idp_remote_identifier:"},{"line_number":129,"context_line":"            raise exception.ValidationError(\"Identity provider identifier not accessible\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_03e812b3","line":126,"in_reply_to":"3a961159_595e9046","updated":"2014-12-18 16:23:41.000000000","message":"if I get properly, you specify the protocol using the API and not the configuration. However, I agree the protocol should not be hard-coded.\n\nAnyway, I\u0027ll change the logic here.","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a222652d8b0cb21dfe12fef7b4fef7ba602f160","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    if protocol\u003d\u003d\"saml2\":"},{"line_number":127,"context_line":"        idp_remote_identifier \u003d assertion[\u0027Shib-Identity-Provider\u0027]"},{"line_number":128,"context_line":"        if not idp_remote_identifier:"},{"line_number":129,"context_line":"            raise exception.ValidationError(\"Identity provider identifier not accessible\")"},{"line_number":130,"context_line":"    if idp.remote_id:"},{"line_number":131,"context_line":"        if re.search(idp_remote_identifier,idp.remote_id):"},{"line_number":132,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_39ec648f","line":129,"updated":"2014-12-18 13:00:52.000000000","message":"I think we cannot assume a Shibboleth will be used as a Service Provider. This is the recommendation, but some people have Keystone running with mod_mellon. \nThat\u0027s why this parameter should be specified in keystone.conf file.","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"e0ee94178580a993fe7cc8184b3bdb25941d2e29","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    if protocol\u003d\u003d\"saml2\":"},{"line_number":127,"context_line":"        idp_remote_identifier \u003d assertion[\u0027Shib-Identity-Provider\u0027]"},{"line_number":128,"context_line":"        if not idp_remote_identifier:"},{"line_number":129,"context_line":"            raise exception.ValidationError(\"Identity provider identifier not accessible\")"},{"line_number":130,"context_line":"    if idp.remote_id:"},{"line_number":131,"context_line":"        if re.search(idp_remote_identifier,idp.remote_id):"},{"line_number":132,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_43ddba6f","line":129,"in_reply_to":"3a961159_39ec648f","updated":"2014-12-18 16:23:41.000000000","message":"OK, I\u0027ll move this to the configuration file.","commit_id":"7e0e5a21d839337806b62d278033f3c3e4185ffe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38c07f375ebdc51d69b4aaa2c17ad4df8110ddca","unresolved":false,"context_lines":[{"line_number":125,"context_line":"def validate_idp(idp, assertion, protocol):"},{"line_number":126,"context_line":"    idp_assertion \u003d CONF.federation.entity_id_attribute"},{"line_number":127,"context_line":"    idp_remote_identifier \u003d None"},{"line_number":128,"context_line":"    if idp_assertion !\u003d \u0027None\u0027:"},{"line_number":129,"context_line":"        idp_remote_identifier \u003d assertion[idp_assertion]"},{"line_number":130,"context_line":"        if not idp_remote_identifier:"},{"line_number":131,"context_line":"            raise exception.ValidationError(\u0027Identity provider identifier \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f0d49fbe","line":128,"updated":"2014-12-18 19:05:44.000000000","message":"i think you want:\n\n  if not idp_assertion:","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"754dd8f328ce33448f8dcb6fd08bd350db0c891d","unresolved":false,"context_lines":[{"line_number":125,"context_line":"def validate_idp(idp, assertion, protocol):"},{"line_number":126,"context_line":"    idp_assertion \u003d CONF.federation.entity_id_attribute"},{"line_number":127,"context_line":"    idp_remote_identifier \u003d None"},{"line_number":128,"context_line":"    if idp_assertion !\u003d \u0027None\u0027:"},{"line_number":129,"context_line":"        idp_remote_identifier \u003d assertion[idp_assertion]"},{"line_number":130,"context_line":"        if not idp_remote_identifier:"},{"line_number":131,"context_line":"            raise exception.ValidationError(\u0027Identity provider identifier \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_373fe888","line":128,"in_reply_to":"3a961159_f0d49fbe","updated":"2014-12-19 15:36:13.000000000","message":"Done","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38c07f375ebdc51d69b4aaa2c17ad4df8110ddca","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    if idp_assertion !\u003d \u0027None\u0027:"},{"line_number":129,"context_line":"        idp_remote_identifier \u003d assertion[idp_assertion]"},{"line_number":130,"context_line":"        if not idp_remote_identifier:"},{"line_number":131,"context_line":"            raise exception.ValidationError(\u0027Identity provider identifier \u0027"},{"line_number":132,"context_line":"                                            \u0027not accessible\u0027)"},{"line_number":133,"context_line":"    if idp.remote_id and idp_remote_identifier:"},{"line_number":134,"context_line":"        if re.search(idp_remote_identifier, idp.remote_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_70a50f46","line":131,"updated":"2014-12-18 19:05:44.000000000","message":"the messages could be a bit more helpful, \n\n  msg \u003d \u0027Could not find Identity Provider identifier in environment \u0027\n        \u0027check [federation] entity_id_attribute for details.\u0027","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"754dd8f328ce33448f8dcb6fd08bd350db0c891d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    if idp_assertion !\u003d \u0027None\u0027:"},{"line_number":129,"context_line":"        idp_remote_identifier \u003d assertion[idp_assertion]"},{"line_number":130,"context_line":"        if not idp_remote_identifier:"},{"line_number":131,"context_line":"            raise exception.ValidationError(\u0027Identity provider identifier \u0027"},{"line_number":132,"context_line":"                                            \u0027not accessible\u0027)"},{"line_number":133,"context_line":"    if idp.remote_id and idp_remote_identifier:"},{"line_number":134,"context_line":"        if re.search(idp_remote_identifier, idp.remote_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_77733080","line":131,"in_reply_to":"3a961159_70a50f46","updated":"2014-12-19 15:36:13.000000000","message":"Done","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38c07f375ebdc51d69b4aaa2c17ad4df8110ddca","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if re.search(idp_remote_identifier, idp.remote_id):"},{"line_number":135,"context_line":"            return True"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":"    return True"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_902b5bea","line":137,"updated":"2014-12-18 19:05:44.000000000","message":"this is the only like should have have raised an unauthorizedError, suggest moving it here\n\n  if not re.search(idp_remote_identifier, idp.remote_id):\n    msg \u003d \u0027Identity Provider\u0027s remote identifier $idp.remoteid \u0027\n          \u0027and incoming Identity Provider identifier \u0027\n          \u0027idp_remote_identifer do not match, check [federation] \u0027\n          \u0027entity_id_attribute for details.\"\n    raise UnauthorizedError(msg)","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"754dd8f328ce33448f8dcb6fd08bd350db0c891d","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if re.search(idp_remote_identifier, idp.remote_id):"},{"line_number":135,"context_line":"            return True"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":"    return True"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_97cc1c8b","line":137,"in_reply_to":"3a961159_902b5bea","updated":"2014-12-19 15:36:13.000000000","message":"Done","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38c07f375ebdc51d69b4aaa2c17ad4df8110ddca","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            return True"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":"    return True"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"def validate_groups(group_ids, mapping_id, identity_api):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b07cd7ec","line":138,"updated":"2014-12-18 19:05:44.000000000","message":"theres no need to return anything, if you are just checking to raise exceptions.","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"754dd8f328ce33448f8dcb6fd08bd350db0c891d","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            return True"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":"    return True"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"def validate_groups(group_ids, mapping_id, identity_api):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b7c5985d","line":138,"in_reply_to":"3a961159_b07cd7ec","updated":"2014-12-19 15:36:13.000000000","message":"Done","commit_id":"c0e47ca64422ee6085f9b81c3dc22c0dc7bffb5d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2fe84cb11edd3e6a65d1665da51e5a0865cb89e6","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    if idp_assertion:"},{"line_number":129,"context_line":"        idp_remote_identifier \u003d assertion[idp_assertion]"},{"line_number":130,"context_line":"        if not idp_remote_identifier:"},{"line_number":131,"context_line":"            raise exception.ValidationError(\u0027Could not find Identity Provider \u0027"},{"line_number":132,"context_line":"                                            \u0027identifier in environment check \u0027"},{"line_number":133,"context_line":"                                            \u0027[federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                                            \u0027for details.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_7ff93e7f","line":131,"updated":"2014-12-19 17:14:42.000000000","message":"suggest using _() to mark it for translation, and place it in a msg variable for consistency :)","commit_id":"11016617efafa8f83c97bea89312e4e5a4ae9d01"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"88c7d1db91041a4849157a5426c8d7473de76275","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    if idp_assertion:"},{"line_number":129,"context_line":"        idp_remote_identifier \u003d assertion[idp_assertion]"},{"line_number":130,"context_line":"        if not idp_remote_identifier:"},{"line_number":131,"context_line":"            raise exception.ValidationError(\u0027Could not find Identity Provider \u0027"},{"line_number":132,"context_line":"                                            \u0027identifier in environment check \u0027"},{"line_number":133,"context_line":"                                            \u0027[federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                                            \u0027for details.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_9b6fd0fb","line":131,"in_reply_to":"3a961159_7ff93e7f","updated":"2014-12-20 15:24:22.000000000","message":"Done","commit_id":"11016617efafa8f83c97bea89312e4e5a4ae9d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a81bc81363eece425d75edffbed76dd38e13d74","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027for details.\u0027)"},{"line_number":134,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":135,"context_line":"    if idp[\u0027remote_id\u0027] and idp_remote_identifier:"},{"line_number":136,"context_line":"        if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_e9a3c040","line":136,"updated":"2015-01-06 13:13:09.000000000","message":"Is there any particular reason why you want to use REs here? \nMy understanding is that we should compare and look for identical strings. Also mind that searching for \u0027\u0027 (empty string) will always give you True:\n\n import re\nr \u003d re.search(\u0027\u0027, \u0027https://cern.ch/login\u0027)\nif r:\n    print \"BOOLEAN TRUE\"\n    print \"RESULT: %s\" % r.group()\nelse:\n    print \"BOOLEAN FALSE\"\n\nwill print \nBOOLEAN TRUE\nRESULT:","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"7aba470de9cfed1d2154a38fd91b05c8a68a4b25","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027for details.\u0027)"},{"line_number":134,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":135,"context_line":"    if idp[\u0027remote_id\u0027] and idp_remote_identifier:"},{"line_number":136,"context_line":"        if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_edae4ce6","line":136,"in_reply_to":"3a961159_e9a3c040","updated":"2015-01-07 12:02:29.000000000","message":"Actually, my idea is that the idp[\u0027remote_id\u0027] could be like \u0027entityId1,entityId2,...,entitiIdn\u0027 therefore it is possible to use one keystone IdP to map multiple IdPs.\n\nAbout the empty string, this is the reason of the previous if. I\u0027ll change the code using your suggestion but I would maintain the map 1 to many, is there better option then re in this case? I was thinking to create a list and search inside but at the end I discard because I did not like too much. Do you prefer that approach?","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"34a8f56668e368f2785fef3b9113dab878f7b198","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027for details.\u0027)"},{"line_number":134,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":135,"context_line":"    if idp[\u0027remote_id\u0027] and idp_remote_identifier:"},{"line_number":136,"context_line":"        if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_7e3120a1","line":136,"in_reply_to":"3a961159_edae4ce6","updated":"2015-01-07 13:42:45.000000000","message":"I personally think multiple remote_id cases should be handled via lists, not a concatened string. And this deserves separate patch if not a separate blueprint.\nIn this patch I would simply consider one remote_id per IdentityProvider object. \n\nOne replacement for the re.search() would be something like:\n\nremote_ids \u003d idp[\u0027remote_id\u0027].split(\u0027,\u0027)\nfor remote_id in remote_ids:\n    if remote_id \u003d\u003d idp_remote_identifier:\n      return\nelse:\n    raise/ return False / indicate there is something wrong. \n\nbut as I said I don\u0027t think this is a good approach in general.","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2a81bc81363eece425d75edffbed76dd38e13d74","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"def validate_groups(group_ids, mapping_id, identity_api):"},{"line_number":143,"context_line":"    if not group_ids:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_c45189da","line":140,"updated":"2015-01-06 13:13:09.000000000","message":"We can try reducing few if branches: \n\ndef validate_assertion(idp, assertion):\n\n    # If the attribute is empty it means remote_id should not be validated with\n    # this idp.\n    if not idp[\u0027remote_id\u0027]:\n        return\n\n    remote_idp_parameter \u003d CONF.federation.entity_id_attribute\n    if not remote_idp_parameter:\n        return\n\n\n    assertion_remote_id \u003d assertion.get(remote_idp_parameter)\n    if not assertion_remote_id:\n        LOG.debug(\"Missing remote_id attribute in incoming assertion\")\n        raise ValidationError(msg)\n\n    if idp[\u0027remote_id\u0027] !\u003d assertion_remote_id:\n        raise exception.ValidationError()","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"7aba470de9cfed1d2154a38fd91b05c8a68a4b25","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"def validate_groups(group_ids, mapping_id, identity_api):"},{"line_number":143,"context_line":"    if not group_ids:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_8da068f5","line":140,"in_reply_to":"3a961159_c45189da","updated":"2015-01-07 12:02:29.000000000","message":"Done","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"19c1c9c7addde21032cf5ac68bbe9c8f7ed6054a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"def validate_groups(group_ids, mapping_id, identity_api):"},{"line_number":143,"context_line":"    if not group_ids:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_c97b5d27","line":140,"in_reply_to":"3a961159_c45189da","updated":"2015-01-06 16:47:22.000000000","message":"i think you can condense the first two of marek\u0027s suggestion to:\n\n  remote_idp_parameter \u003d CONF.federation.entity_id_attribute\n  if not idp[\u0027remote_id\u0027] or not remote_idp_parameter:\n    return","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"7aba470de9cfed1d2154a38fd91b05c8a68a4b25","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                    \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"            raise exception.Forbidden(msg)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"def validate_groups(group_ids, mapping_id, identity_api):"},{"line_number":143,"context_line":"    if not group_ids:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_ada1a4f8","line":140,"in_reply_to":"3a961159_c97b5d27","updated":"2015-01-07 12:02:29.000000000","message":"Done","commit_id":"5aeb661a2bafc044093b1f69bde8c681b4efa978"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7f40862984ac30381afe60de07e45fbb2924ab94","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def validate_idp(idp, assertion):"},{"line_number":126,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":127,"context_line":"    idp_remote_identifier \u003d None"},{"line_number":128,"context_line":"    if not remote_id_parameteri or not idp[\u0027remote_id\u0027]:"},{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":"    idp_remote_identifier \u003d assertion[remote_id_parameter]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_fe1c3015","line":127,"updated":"2015-01-07 13:42:51.000000000","message":"do we need to have it here?","commit_id":"1fd29e40194e520c177aaae847c9d14a64c65b2b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7f40862984ac30381afe60de07e45fbb2924ab94","unresolved":false,"context_lines":[{"line_number":125,"context_line":"def validate_idp(idp, assertion):"},{"line_number":126,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":127,"context_line":"    idp_remote_identifier \u003d None"},{"line_number":128,"context_line":"    if not remote_id_parameteri or not idp[\u0027remote_id\u0027]:"},{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":"    idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":131,"context_line":"    if not idp_remote_identifier:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_de1f7407","line":128,"updated":"2015-01-07 13:42:51.000000000","message":"parameter","commit_id":"1fd29e40194e520c177aaae847c9d14a64c65b2b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7f40862984ac30381afe60de07e45fbb2924ab94","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    idp_remote_identifier \u003d None"},{"line_number":128,"context_line":"    if not remote_id_parameteri or not idp[\u0027remote_id\u0027]:"},{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":"    idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":131,"context_line":"    if not idp_remote_identifier:"},{"line_number":132,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_fe919052","line":130,"updated":"2015-01-07 13:42:51.000000000","message":"it\u0027d be worth checking what happens if remote_id_parameter is not present in the assertion. Normally KeyError will be raised, but I don\u0027t know what will happend next - will it transform into some HTTP500 exception? \nBesides, it looks like you want idp_remote_idnetifier.get(remote_id_parmaeter).\nOtherwise next tests (if not idp_remote_identifier) are unnecessary.","commit_id":"1fd29e40194e520c177aaae847c9d14a64c65b2b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c45c814856a580deaedad59fadc4f5afeae70cf1","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":127,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":128,"context_line":"        return"},{"line_number":129,"context_line":"    idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":130,"context_line":"    if not idp_remote_identifier:"},{"line_number":131,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":132,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_17a39e00","line":129,"updated":"2015-01-07 14:28:10.000000000","message":"it\u0027d be worth checking what happens if remote_id_parameter is not present in the assertion. Normally KeyError will be raised, but I don\u0027t know what will happend next - will it transform into some HTTP500 exception? Besides, it looks like you want idp_remote_idnetifier.get(remote_id_parmaeter). Otherwise next tests (if not idp_remote_identifier) are unnecessary.","commit_id":"43c10e49c0a42925cf9a9c1aa600f1b836dc658a"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"5b055daf35fe758688720212c87b8338cb0a5923","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":127,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":128,"context_line":"        return"},{"line_number":129,"context_line":"    idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":130,"context_line":"    if not idp_remote_identifier:"},{"line_number":131,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":132,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_17c8fea6","line":129,"in_reply_to":"3a961159_17a39e00","updated":"2015-01-07 14:30:47.000000000","message":"I do not get what you mean here. In my tests, if I specify a wrong \u0027remote_id_parameter\u0027 and the assertion does not exist there is not exception and I get the ValidationError in the following if. Do I miss something?","commit_id":"43c10e49c0a42925cf9a9c1aa600f1b836dc658a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2de9c9f94d4faedaded0835a96ce3543786163c1","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":127,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":128,"context_line":"        return"},{"line_number":129,"context_line":"    idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":130,"context_line":"    if not idp_remote_identifier:"},{"line_number":131,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":132,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_b7bc8ab6","line":129,"in_reply_to":"3a961159_17c8fea6","updated":"2015-01-07 14:38:47.000000000","message":"An example:\n\nd \u003d {\u0027a\u0027: 1}\n\nparameter \u003d d[\u0027b\u0027]\nif not parameter:\n    print(\"ERROR\")\n    \n# do sth else\n\nwill produce:\n\nKeyError                                  Traceback (most recent call last)\n\u003cipython-input-16-888cfd765e91\u003e in \u003cmodule\u003e()\n      1 d \u003d {\u0027a\u0027: 1}\n      2 \n----\u003e 3 parameter \u003d d[\u0027b\u0027]\n      4 if not parameter:\n      5     print(\"ERROR\")\n\nKeyError: \u0027b\u0027","commit_id":"43c10e49c0a42925cf9a9c1aa600f1b836dc658a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"aa51521f7532298f14c70171483e5c2de37dcb07","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_85d8caf1","line":136,"updated":"2015-01-12 16:12:10.000000000","message":"I personally think multiple remote_id cases should be handled via lists, not a concatened string. And this deserves separate patch if not a separate blueprint. In this patch I would simply consider one remote_id per IdentityProvider object.\nOne replacement for the re.search() would be something like:\nremote_ids \u003d idp[\u0027remote_id\u0027].split(\u0027,\u0027)\nfor remote_id in remote_ids:\n    if remote_id \u003d\u003d idp_remote_identifier:\n      return\nelse:\n    raise/ return False / indicate there is something wrong. \nbut as I said I don\u0027t think this is a good approach in general.","commit_id":"49c2c5fa0f91910aef2166a51f0cd0e92a6b7184"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"171fa2c55ed3014403630a99576aa0062f517d21","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_88c70146","line":136,"updated":"2015-01-12 16:33:37.000000000","message":"I tend to agree with the comment by marekd on the previous version, that search a string for this seems an odd design (and I wonder if it is safe?).  Is there a reason to not use a list, here?","commit_id":"a03b18bd5a8ece51410d8eb1c552cbdc80f3497e"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"39e6970d284210d7fd263583d54f89bf21a4e052","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_f0ff6d33","line":136,"in_reply_to":"3a961159_58c79c46","updated":"2015-01-13 10:43:13.000000000","message":"Done","commit_id":"a03b18bd5a8ece51410d8eb1c552cbdc80f3497e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"99779dd660ce881dffe0ec90ebf386003ba6c57d","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_58c79c46","line":136,"in_reply_to":"3a961159_88c70146","updated":"2015-01-12 22:07:09.000000000","message":"++\nMy sugestion is to make this patch work with one region_id, and followup (maybe even with a spec) with a solution allowing for specifying multiple remote_id values per one IDP.","commit_id":"a03b18bd5a8ece51410d8eb1c552cbdc80f3497e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"315c7a15c30494491ac700c577611c81ea0a28d3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not re.search(idp_remote_identifier, idp[\u0027remote_id\u0027]):"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_b84320ae","line":136,"in_reply_to":"3a961159_88c70146","updated":"2015-01-12 21:57:40.000000000","message":"++ agree with both marek and henry here. why use a string?","commit_id":"a03b18bd5a8ece51410d8eb1c552cbdc80f3497e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"daf5f9a87908a6d039750c6fd80ccc842e71ff58","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not idp_remote_identifier \u003d\u003d idp[\u0027remote_id\u0027]:"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_36bbaee5","line":136,"updated":"2015-01-13 11:02:32.000000000","message":"I think it\u0027d be easier to read:\n\nif idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:\n    raise","commit_id":"1ae6a40b8eca5533b6546a3cbcdf8bf2322c360d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2932b3db51c6977828b7bd907c0a9c206b512e88","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":134,"context_line":"                \u0027for details.\u0027)"},{"line_number":135,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":136,"context_line":"    if not idp_remote_identifier \u003d\u003d idp[\u0027remote_id\u0027]:"},{"line_number":137,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":138,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":139,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_3689ee25","line":136,"in_reply_to":"3a961159_36bbaee5","updated":"2015-01-13 11:04:13.000000000","message":"Done","commit_id":"1ae6a40b8eca5533b6546a3cbcdf8bf2322c360d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"94ca6f2ebff442af8d360b6a9caec3b7c30763e3","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":144,"context_line":"    except KeyError:"},{"line_number":145,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":146,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa81d914_1b451a70","line":146,"updated":"2015-01-28 18:52:09.000000000","message":"add a comma (,) after environment.","commit_id":"9ba37672872accbcf8cc53d1cbcc45dcc6d88a25"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"18beaa979aa454782680a4c3093bc9a6f6829f52","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":144,"context_line":"    except KeyError:"},{"line_number":145,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":146,"context_line":"                \u0027environment check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa81d914_3549db8b","line":146,"in_reply_to":"fa81d914_1b451a70","updated":"2015-01-29 14:50:22.000000000","message":"Done","commit_id":"9ba37672872accbcf8cc53d1cbcc45dcc6d88a25"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":138,"context_line":"def validate_idp(idp, assertion):"},{"line_number":139,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":140,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":141,"context_line":"        return"},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":144,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_cd3c60e5","line":141,"updated":"2015-01-29 23:01:32.000000000","message":"add a comment why it\u0027s ok to return here.\n\nAlso, seems like it would be good to log a warning since the server is configured in a way that\u0027s not secure.","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":138,"context_line":"def validate_idp(idp, assertion):"},{"line_number":139,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":140,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":141,"context_line":"        return"},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":144,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_6b150b3f","line":141,"in_reply_to":"fa81d914_cd3c60e5","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":144,"context_line":"    except KeyError:"},{"line_number":145,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":146,"context_line":"                \u0027environment, check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_2d217cb4","line":146,"updated":"2015-01-29 23:01:32.000000000","message":"change \"entity_id_attribute\" to \"remote_id_attribute\"","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"},{"line_number":144,"context_line":"    except KeyError:"},{"line_number":145,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":146,"context_line":"                \u0027environment, check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_4b24c7ae","line":146,"in_reply_to":"fa81d914_2d217cb4","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":146,"context_line":"                \u0027environment, check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"},{"line_number":150,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":151,"context_line":"                \u0027among the accpeted identifiers.\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_48a05e9f","line":148,"updated":"2015-01-29 23:01:32.000000000","message":"The coverage reports show that this isn\u0027t tested. Add a test.","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        msg \u003d _(\u0027Could not find Identity Provider identifier in \u0027"},{"line_number":146,"context_line":"                \u0027environment, check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"},{"line_number":150,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":151,"context_line":"                \u0027among the accpeted identifiers.\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_0ba9ef90","line":148,"in_reply_to":"fa81d914_48a05e9f","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \u0027environment, check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"},{"line_number":150,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":151,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":152,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_e824b2b0","line":149,"updated":"2015-01-29 23:01:32.000000000","message":"it would be safer to use a constant-time string compare here otherwise it\u0027s easy for an attacker to discover what the remote_id is supposed to be.","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \u0027environment, check [federation] entity_id_attribute \u0027"},{"line_number":147,"context_line":"                \u0027for details.\u0027)"},{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"},{"line_number":150,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":151,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":152,"context_line":"        raise exception.Forbidden(msg)"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_6b98abc0","line":149,"in_reply_to":"fa81d914_e824b2b0","updated":"2015-01-30 11:28:41.000000000","message":"The attribute is provided by apache plug-in and this cannot be alterated by the attacker, unless there is a security bug in the plug-in","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"},{"line_number":150,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":151,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":152,"context_line":"        raise exception.Forbidden(msg)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_6830c2e8","line":151,"updated":"2015-01-29 23:01:32.000000000","message":"change \"accpeted\" to \"accepeted\"","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        raise exception.ValidationError(msg)"},{"line_number":149,"context_line":"    if idp_remote_identifier !\u003d idp[\u0027remote_id\u0027]:"},{"line_number":150,"context_line":"        msg \u003d _(\u0027Incoming identity provider identifier not included \u0027"},{"line_number":151,"context_line":"                \u0027among the accpeted identifiers.\u0027)"},{"line_number":152,"context_line":"        raise exception.Forbidden(msg)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_2bf23306","line":151,"in_reply_to":"fa81d914_6830c2e8","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c767ba4915cc2196365b31234737f1f710f0058","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def validate_idp(idp, assertion):"},{"line_number":139,"context_line":"    \"\"\"Check if the IDP providing the assertion is the one registered for"},{"line_number":140,"context_line":"       the mapping"},{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_486da2cb","line":139,"updated":"2015-01-30 16:34:34.000000000","message":"IdP*","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"672d0261f5162fa6d41e446a77c25aa69a27f8a8","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def validate_idp(idp, assertion):"},{"line_number":139,"context_line":"    \"\"\"Check if the IDP providing the assertion is the one registered for"},{"line_number":140,"context_line":"       the mapping"},{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_99a8cbdc","line":139,"in_reply_to":"fa81d914_486da2cb","updated":"2015-01-30 18:58:17.000000000","message":"Done","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c767ba4915cc2196365b31234737f1f710f0058","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":143,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IDP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        \"\"\"If nothing is defined the administrator want allow the mapping"},{"line_number":147,"context_line":"           of everyy IDP, as from the current behaviour"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_08772aa1","line":144,"updated":"2015-01-30 16:34:34.000000000","message":"IdP*","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"672d0261f5162fa6d41e446a77c25aa69a27f8a8","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":143,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IDP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        \"\"\"If nothing is defined the administrator want allow the mapping"},{"line_number":147,"context_line":"           of everyy IDP, as from the current behaviour"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_d9ade3ea","line":144,"in_reply_to":"fa81d914_08772aa1","updated":"2015-01-30 18:58:17.000000000","message":"Done","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c767ba4915cc2196365b31234737f1f710f0058","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IDP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        \"\"\"If nothing is defined the administrator want allow the mapping"},{"line_number":147,"context_line":"           of everyy IDP, as from the current behaviour"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_a840de34","line":146,"updated":"2015-01-30 16:34:34.000000000","message":"use # comments here:\n\n  # If nothing is defined, the administrator may want to\n  # allow the mapping of every IdP.\n\n\u0027current\u0027 is meaningless in code","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"672d0261f5162fa6d41e446a77c25aa69a27f8a8","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_id\u0027]:"},{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IDP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        \"\"\"If nothing is defined the administrator want allow the mapping"},{"line_number":147,"context_line":"           of everyy IDP, as from the current behaviour"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa81d914_19e21b2f","line":146,"in_reply_to":"fa81d914_a840de34","updated":"2015-01-30 18:58:17.000000000","message":"Done","commit_id":"2456284a42db06a494221e468c78ca9bf7d53fba"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"f056b1a3c9f28e768c6981aaccd0cefdabadb67e","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        # If nothing is defined, the administrator may want to"},{"line_number":147,"context_line":"        # allow the mapping of everyy IdP"},{"line_number":148,"context_line":"        return"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"}],"source_content_type":"text/x-python","patch_set":32,"id":"da86d52c_69b045f5","line":147,"updated":"2015-01-30 19:48:11.000000000","message":"(nit) Typo - \"every\".  Not worth a -1 for this, but fix it if another patch is needed for something more important.","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c841d3c70ff11d33b2036182096eae1e0b923cd0","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        # If nothing is defined, the administrator may want to"},{"line_number":147,"context_line":"        # allow the mapping of everyy IdP"},{"line_number":148,"context_line":"        return"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"}],"source_content_type":"text/x-python","patch_set":32,"id":"da86d52c_cc021fb4","line":147,"in_reply_to":"da86d52c_69b045f5","updated":"2015-01-30 20:09:28.000000000","message":"++ same reasoning","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"8737fe8e1e86c9c1595867616b11336157cb0ea5","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":145,"context_line":"                    idp[\u0027id\u0027])"},{"line_number":146,"context_line":"        # If nothing is defined, the administrator may want to"},{"line_number":147,"context_line":"        # allow the mapping of everyy IdP"},{"line_number":148,"context_line":"        return"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        idp_remote_identifier \u003d assertion[remote_id_parameter]"}],"source_content_type":"text/x-python","patch_set":32,"id":"da86d52c_f909432d","line":147,"in_reply_to":"da86d52c_cc021fb4","updated":"2015-02-02 08:07:50.000000000","message":"addressed in patch  https://review.openstack.org/152016","commit_id":"bd5309e6bfc4186c395a991701dd0de7917ca599"}],"keystone/tests/test_v3_federation.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"398321d7945324c6ca40e77fbcab3591892857b7","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":158,"context_line":"                                 ref\u003dbody)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_list_idps(self, iterations\u003d5):"},{"line_number":161,"context_line":"        \"\"\"Lists all available IdentityProviders."}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_34046049","line":158,"updated":"2015-01-30 03:48:09.000000000","message":"I think we should add a test for update too.","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":158,"context_line":"                                 ref\u003dbody)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_list_idps(self, iterations\u003d5):"},{"line_number":161,"context_line":"        \"\"\"Lists all available IdentityProviders."}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_2eafa17e","line":158,"in_reply_to":"fa81d914_34046049","updated":"2015-01-30 11:28:41.000000000","message":"Added the remote_id to the test: \"test_update_idp_mutable_attributes\"","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":158,"context_line":"                                 ref\u003dbody)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_list_idps(self, iterations\u003d5):"},{"line_number":161,"context_line":"        \"\"\"Lists all available IdentityProviders."}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_aee391a2","line":158,"in_reply_to":"fa81d914_34046049","updated":"2015-01-30 11:28:41.000000000","message":"Added the remote_id to the test: \"test_update_idp_mutable_attributes\"","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":995,"context_line":""},{"line_number":996,"context_line":"    def test_issue_unscoped_token_with_remote(self):"},{"line_number":997,"context_line":"        self.config_fixture.config(group\u003d\u0027federation\u0027,"},{"line_number":998,"context_line":"                                   remote_id_attribute\u003d\u0027remote_id\u0027)"},{"line_number":999,"context_line":"        r \u003d self._issue_unscoped_token(idp\u003dself.IDP_WITH_REMOTE,"},{"line_number":1000,"context_line":"                                       environment\u003d{"},{"line_number":1001,"context_line":"                                           \u0027remote_id\u0027: self.REMOTE_ID"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_48bf7efb","line":998,"updated":"2015-01-29 23:01:32.000000000","message":"this could use a random string instead of \"remote_id\".","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":995,"context_line":""},{"line_number":996,"context_line":"    def test_issue_unscoped_token_with_remote(self):"},{"line_number":997,"context_line":"        self.config_fixture.config(group\u003d\u0027federation\u0027,"},{"line_number":998,"context_line":"                                   remote_id_attribute\u003d\u0027remote_id\u0027)"},{"line_number":999,"context_line":"        r \u003d self._issue_unscoped_token(idp\u003dself.IDP_WITH_REMOTE,"},{"line_number":1000,"context_line":"                                       environment\u003d{"},{"line_number":1001,"context_line":"                                           \u0027remote_id\u0027: self.REMOTE_ID"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_2eaa4185","line":998,"in_reply_to":"fa81d914_48bf7efb","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b82c699d11fbcf3349800231e1e57d07c20065ef","unresolved":false,"context_lines":[{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":"    def test_issue_unscoped_token_with_remote_different(self):"},{"line_number":1006,"context_line":"        self.config_fixture.config(group\u003d\u0027federation\u0027,"},{"line_number":1007,"context_line":"                                   remote_id_attribute\u003d\u0027remote_id\u0027)"},{"line_number":1008,"context_line":"        self.assertRaises(exception.Forbidden,"},{"line_number":1009,"context_line":"                          self._issue_unscoped_token,"},{"line_number":1010,"context_line":"                          idp\u003dself.IDP_WITH_REMOTE,"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_a83b9a9a","line":1007,"updated":"2015-01-29 23:01:32.000000000","message":"same here.","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5f00d0f72ad87b7984e219ef1d7645710a07b5","unresolved":false,"context_lines":[{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":"    def test_issue_unscoped_token_with_remote_different(self):"},{"line_number":1006,"context_line":"        self.config_fixture.config(group\u003d\u0027federation\u0027,"},{"line_number":1007,"context_line":"                                   remote_id_attribute\u003d\u0027remote_id\u0027)"},{"line_number":1008,"context_line":"        self.assertRaises(exception.Forbidden,"},{"line_number":1009,"context_line":"                          self._issue_unscoped_token,"},{"line_number":1010,"context_line":"                          idp\u003dself.IDP_WITH_REMOTE,"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa81d914_4eaf7594","line":1007,"in_reply_to":"fa81d914_a83b9a9a","updated":"2015-01-30 11:28:41.000000000","message":"Done","commit_id":"525384b61554a5bcf26d6cb00589788c8ddb1bab"}]}
