)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"28a0b2d03ff121d081c3350e26e9e9cc01ee7e02","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Reengineers federation to ensure that the process for authentication"},{"line_number":10,"context_line":"using a federated source is standardized for all protocols."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If9a8cbf62334c796a70e939bf00e7b194e5749c8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"baada198_06cdb8ba","line":11,"updated":"2014-07-30 00:59:59.000000000","message":"link to blueprint/spec?","commit_id":"74bdb8e3a330c49b684114c3f25b6d14ce7daab4"}],"keystone/auth/controllers.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"5d061bb57b5a7f6b99f7a30b434e30d33002108b","unresolved":false,"context_lines":[{"line_number":465,"context_line":"            try:"},{"line_number":466,"context_line":"                external \u003d get_auth_method(\u0027external\u0027)"},{"line_number":467,"context_line":"                external.authenticate(context, auth_info, auth_context)"},{"line_number":468,"context_line":"            except exception.AuthMethodNotSupported:"},{"line_number":469,"context_line":"                # This will happen there is no \u0027external\u0027 plugin registered"},{"line_number":470,"context_line":"                # and the container is performing authentication."},{"line_number":471,"context_line":"                # The \u0027kerberos\u0027  and \u0027saml\u0027 methods will be used this way."}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_1912fd56","line":468,"updated":"2014-08-21 14:22:23.000000000","message":"how about logging this exception?","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"409d52c0ca6400e185056763ffee82b76025e001","unresolved":false,"context_lines":[{"line_number":465,"context_line":"            try:"},{"line_number":466,"context_line":"                external \u003d get_auth_method(\u0027external\u0027)"},{"line_number":467,"context_line":"                external.authenticate(context, auth_info, auth_context)"},{"line_number":468,"context_line":"            except exception.AuthMethodNotSupported:"},{"line_number":469,"context_line":"                # This will happen there is no \u0027external\u0027 plugin registered"},{"line_number":470,"context_line":"                # and the container is performing authentication."},{"line_number":471,"context_line":"                # The \u0027kerberos\u0027  and \u0027saml\u0027 methods will be used this way."}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_0bb0d5db","line":468,"in_reply_to":"1abeadc6_1912fd56","updated":"2014-08-21 22:10:47.000000000","message":"Remove this whole chunk of code from the controller:  it really belongs in the mapping plugin.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5956,"name":"Kristy Siu","email":"kwss@kent.ac.uk","username":"kwss"},"change_message_id":"bd6d8c22227a5ad7d8897dc67b81d0b70fd9f2b0","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_10bc99db","line":479,"updated":"2014-08-21 11:04:20.000000000","message":"This should solve the problem when REMOTE_USER is set and the external plugin is enabled until external has been refactored.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d1154fa3786bfb3545ea239bf21be523510cd210","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_8cb40083","line":479,"updated":"2014-08-21 21:25:53.000000000","message":"this seems like a change in behaviour, and probably needs a DocImpact tag in the commit msg","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4a455c71a9a82abb90edee649036683b09727525","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_b3a12f96","line":479,"in_reply_to":"1abeadc6_10bc99db","updated":"2014-08-21 11:39:42.000000000","message":"Well, that\u0027s a very hackkyy workaround.\n\nWhy are you insisting on REMOTE_USER anyway?","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"5d061bb57b5a7f6b99f7a30b434e30d33002108b","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_7515b747","line":479,"in_reply_to":"1abeadc6_299cd00e","updated":"2014-08-21 14:22:23.000000000","message":"One more thing here: how about logging that exception?\nLOG.DEBUG(\u0027REMOTE_USER is set, but the external authentication is failing\u0027) or something like that.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d472433190205b7780a375ac7f4545d66b4234d","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_a6700f73","line":479,"in_reply_to":"1abeadc6_866953c0","updated":"2014-08-21 12:08:37.000000000","message":"That\u0027s something :-)\n\nDo you expect to have a sonfiguratoin without mapping involved (RuleProcessor class) ? Otherwise you will always need to specify something in the user_id in the rules.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5956,"name":"Kristy Siu","email":"kwss@kent.ac.uk","username":"kwss"},"change_message_id":"c52d570e3a1e3fca9b0c269c3b379d5b79f6760c","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_299cd00e","line":479,"in_reply_to":"1abeadc6_a6700f73","updated":"2014-08-21 12:36:48.000000000","message":"At this time, it\u0027s sufficient for me to able to map on the asserted user_id, but it would be nice later to remove the need for the compulsory mapping. Each protocol has a unique way of carrying the unique user identity so it should be the responsibility of the assertion extraction rather than the mapping engine to determine this.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5956,"name":"Kristy Siu","email":"kwss@kent.ac.uk","username":"kwss"},"change_message_id":"7ddbcc34f624d0ef389241601b5fd4d409b57f53","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            except exception.Unauthorized:"},{"line_number":477,"context_line":"                # If external fails then continue and attempt to determine"},{"line_number":478,"context_line":"                # user identity using remaining auth methods"},{"line_number":479,"context_line":"                pass"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        # need to aggregate the results in case two or more methods"},{"line_number":482,"context_line":"        # are specified"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_866953c0","line":479,"in_reply_to":"1abeadc6_b3a12f96","updated":"2014-08-21 11:51:46.000000000","message":"I\u0027d like to be able to map on user_id without worrying about which protocol was used","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"}],"keystone/auth/plugins/federation.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7a4563a0e0c4f3377db91dec6342401f7fda7966","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        }"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _handle_unscoped_token(self, context, auth_payload):"},{"line_number":66,"context_line":"        assertion \u003d dict(utils.get_assertion_data(context, auth_payload))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":69,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_97ed82f2","line":66,"updated":"2014-07-09 04:18:56.000000000","message":"didn\u0027t you propose to change that?","commit_id":"74bdb8e3a330c49b684114c3f25b6d14ce7daab4"}],"keystone/auth/plugins/mapped.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"13fdf76bdc7e21baa2ded79ed36319f5634965fa","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class Mapped(auth.AuthMethodHandler):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def authenticate(self, context, auth_payload, auth_context):"},{"line_number":26,"context_line":"        \"\"\"Authenticate federated user and return an authentication context."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        :param context: keystone\u0027s request context"},{"line_number":29,"context_line":"        :param auth_payload: the content of the authentication for a"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ac7a964_5af6b9d8","line":26,"updated":"2014-08-14 13:10:52.000000000","message":"maybe we talk about mapped users, not federated users now?","commit_id":"086ef43235c719f5195633fa5045db9c1e5a7318"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"13fdf76bdc7e21baa2ded79ed36319f5634965fa","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        :param auth_context: user authentication context, a dictionary"},{"line_number":32,"context_line":"                             shared by all plugins."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        In addition to ``user_id`` in ``auth_context``, the ``saml2``"},{"line_number":35,"context_line":"        plugin sets ``group_ids``. When handling unscoped tokens,"},{"line_number":36,"context_line":"        ``OS-FEDERATION:identity_provider`` and ``OS-FEDERATION:protocol``"},{"line_number":37,"context_line":"        are set as well."}],"source_content_type":"text/x-python","patch_set":6,"id":"7ac7a964_fa26a567","line":34,"updated":"2014-08-14 13:10:52.000000000","message":"do we mean \"this\" plugin rather than sam2?","commit_id":"086ef43235c719f5195633fa5045db9c1e5a7318"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"13fdf76bdc7e21baa2ded79ed36319f5634965fa","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":58,"context_line":"        return {"},{"line_number":59,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":60,"context_line":"            \u0027group_ids\u0027: group_ids"},{"line_number":61,"context_line":"        }"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _handle_unscoped_token(self, context, auth_payload):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ac7a964_9a74d1fe","line":60,"updated":"2014-08-14 13:10:52.000000000","message":"wasn\u0027t there a change in flight to add the federation protocols here too?","commit_id":"086ef43235c719f5195633fa5045db9c1e5a7318"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e116ff0758bba035cb0182d4105d9fe6c33f07c4","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _extract_assertion_data(self, context):"},{"line_number":85,"context_line":"        assertion \u003d dict(utils.get_assertion_params_from_env(context))"},{"line_number":86,"context_line":"        user_id \u003d context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":87,"context_line":"        return user_id, assertion"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _apply_mapping_filter(self, identity_provider, protocol, assertion):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7ac7a964_b7d8bb54","line":86,"updated":"2014-08-14 16:49:00.000000000","message":"nice","commit_id":"dcf1c6382b10862b8d668b97c7229650d1646339"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e28326f334fbc7e44d17989532f6b5e8407b6c58","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _extract_assertion_data(self, context):"},{"line_number":85,"context_line":"        assertion \u003d dict(utils.get_assertion_params_from_env(context))"},{"line_number":86,"context_line":"        user_id \u003d context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":87,"context_line":"        return user_id, assertion"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _apply_mapping_filter(self, identity_provider, protocol, assertion):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_fc5e8fe8","line":86,"updated":"2014-08-14 21:24:18.000000000","message":"I don\u0027t think we can safely use REMOTE_USER with the current Keystone code. First of all, https://github.com/openstack/keystone/blob/master/keystone/auth/controllers.py#L464 the only check is:\n\nif context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027):\n   ... continue authn with \u0027external\u0027 method.\n\n How can we then handle configuration where external and any of federation methods are used (saml2, oidc, x509) ? I think Keystone will always try to use \u0027external\u0027.\n\nA check in contrib.federation.utils.RuleProcessor: https://github.com/openstack/keystone/blob/master/keystone/contrib/federation/utils.py#L224 will always enforce building a Rule Mapping where a \u0027name\u0027 value created. What is a goal for overwriting user_id value with REMOTE_USER?\n\nAlso, I cannot see any unit test that properly uses federated method and sets REMOTE_USER in the environment.","commit_id":"698926e6bc7de008e999973ba64957afb422904a"}],"keystone/auth/plugins/saml2.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"add85c48d85b871a609d91dfb2cdf3b95c30533d","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from keystone.auth.plugins import mapped"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\" Provide an entry point to authenticate with SAML"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This plugin subclasses mapped.Mapped, and may be specified in keystone.conf:"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_dce2b39e","line":15,"updated":"2014-08-14 21:34:51.000000000","message":"SAML2? There is also a space at the beginning of this comment.","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a4764dd02a5508de0aad86e34fb10292ea877037","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from keystone.auth.plugins import mapped"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\" Provide an entry point to authenticate with SAML"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This plugin subclasses mapped.Mapped, and may be specified in keystone.conf:"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_9d93d5a2","line":15,"in_reply_to":"7ac7a964_dce2b39e","updated":"2014-08-14 22:51:58.000000000","message":"Done","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4d472433190205b7780a375ac7f4545d66b4234d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class Saml2(mapped.Mapped):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    method \u003d \u0027saml2\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_26c15f54","line":25,"updated":"2014-08-21 12:08:37.000000000","message":"what\u0027s the purpose of this. Backward compatilibity only? \nI see in the tests you are setting all the plugins to Mapped.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5956,"name":"Kristy Siu","email":"kwss@kent.ac.uk","username":"kwss"},"change_message_id":"c52d570e3a1e3fca9b0c269c3b379d5b79f6760c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class Saml2(mapped.Mapped):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    method \u003d \u0027saml2\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_29c3f0ed","line":25,"in_reply_to":"1abeadc6_26c15f54","updated":"2014-08-21 12:36:48.000000000","message":"Yes, this is for backwards compatibility. In the test_v3_federation we use this plugin class, but the new tests use the Mapped plugin.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"25db6193087ce6160d91c7e91e08fc2e7b3c6b17","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class Saml2(mapped.Mapped):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    method \u003d \u0027saml2\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_dff94a4f","line":25,"in_reply_to":"1abeadc6_29c3f0ed","updated":"2014-08-21 13:30:48.000000000","message":"It might be sensible to have a test that shows that this backward compatibility works.","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c0e103081e254a9de34e97143afa16845bdedbab","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class Saml2(mapped.Mapped):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    method \u003d \u0027saml2\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_b9e589dd","line":25,"in_reply_to":"1abeadc6_ba0adc23","updated":"2014-08-21 14:36:05.000000000","message":"ah, sorry, my mistake - I was thinking the changes to test_auth_plugin.conf were changing that....","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"},{"author":{"_account_id":5956,"name":"Kristy Siu","email":"kwss@kent.ac.uk","username":"kwss"},"change_message_id":"a505bf692b167e082ba271ee1580e4d18554e0ba","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class Saml2(mapped.Mapped):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    method \u003d \u0027saml2\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_ba0adc23","line":25,"in_reply_to":"1abeadc6_dff94a4f","updated":"2014-08-21 14:02:24.000000000","message":"The test_v3_federation tests use this class (set as keystone.auth.plugins.saml2.Saml2) so this should cover testing that existing deployments using this class will still function. Unless I\u0027m missing something?","commit_id":"b96a7bd0c50890c76d5fed512dacf7175889cf70"}],"keystone/contrib/federation/protocols.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7a4563a0e0c4f3377db91dec6342401f7fda7966","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    name \u003d \"saml2\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_assertion_data(self, context, auth_payload):"},{"line_number":64,"context_line":"        \"\"\"Extract assertion data from the environment set by mod_shib"},{"line_number":65,"context_line":"        or mod_mellon"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_571cca13","line":63,"updated":"2014-07-09 04:18:56.000000000","message":"why would you like it to be a class method?","commit_id":"74bdb8e3a330c49b684114c3f25b6d14ce7daab4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7a4563a0e0c4f3377db91dec6342401f7fda7966","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        assertion.update(self.get_assertion_params_from_env(context))"},{"line_number":90,"context_line":"        return assertion"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @classmethod"},{"line_number":93,"context_line":"    def get_assertion_params_from_env(self, context):"},{"line_number":94,"context_line":"        prefix \u003d CONF.federation.assertion_prefix"},{"line_number":95,"context_line":"        for k, v in context[\u0027environment\u0027].items():"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_b7d28632","line":92,"updated":"2014-07-09 04:18:56.000000000","message":"does it need to be a classmethod? Probably not :-)","commit_id":"74bdb8e3a330c49b684114c3f25b6d14ce7daab4"}],"keystone/contrib/federation/utils.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7a4563a0e0c4f3377db91dec6342401f7fda7966","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def get_protocol_handler(protocol_name):"},{"line_number":140,"context_line":"    em \u003d driver.DriverManager(\u0027keystone.contrib.federation.protocols\u0027,"},{"line_number":141,"context_line":"                              name\u003dprotocol_name)"},{"line_number":142,"context_line":"    return em.driver"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_371f560b","line":140,"updated":"2014-07-09 04:18:56.000000000","message":"this should be wrapped with try/catch","commit_id":"74bdb8e3a330c49b684114c3f25b6d14ce7daab4"}],"keystone/tests/config_files/test_auth_plugin.conf":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e28326f334fbc7e44d17989532f6b5e8407b6c58","unresolved":false,"context_lines":[{"line_number":4,"context_line":"saml2 \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":5,"context_line":"openid \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":6,"context_line":"x509 \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":7,"context_line":""}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_fc604f37","line":7,"updated":"2014-08-14 21:24:18.000000000","message":"why is it all set to \u0027keystone.auth.plugins.mapped.Mapped\u0027 not \u0027keystone.auth.plugins.saml2.Saml2\u0027 (OpenID, X509 respectively)?","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ebbdec0e4195fc192c7460f691f0eaf8676e042c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"saml2 \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":5,"context_line":"openid \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":6,"context_line":"x509 \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":7,"context_line":""}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_459f9f52","line":7,"in_reply_to":"7ac7a964_b758b057","updated":"2014-08-15 00:13:20.000000000","message":"these values aren\u0027t defaulted, so the won\u0027t be a part of the config file","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a83787b6576d100a1e72fcf5e620d82a2cfa7d50","unresolved":false,"context_lines":[{"line_number":4,"context_line":"saml2 \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":5,"context_line":"openid \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":6,"context_line":"x509 \u003d keystone.auth.plugins.mapped.Mapped"},{"line_number":7,"context_line":""}],"source_content_type":"text/plain","patch_set":10,"id":"7ac7a964_b758b057","line":7,"in_reply_to":"7ac7a964_fc604f37","updated":"2014-08-14 21:46:44.000000000","message":"also,  remember to run\n\n# tox -e sample_config\n\nif you are planning to change default values in the config files.","commit_id":"698926e6bc7de008e999973ba64957afb422904a"}],"keystone/tests/test_auth_plugin.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"add85c48d85b871a609d91dfb2cdf3b95c30533d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        with mock.patch.object(auth.plugins.mapped.Mapped,"},{"line_number":177,"context_line":"                               \u0027authenticate\u0027,"},{"line_number":178,"context_line":"                               return_value\u003dNone) as authenticate:"},{"line_number":179,"context_line":"            auth_data \u003d {\u0027methods\u0027: [method_name]}"},{"line_number":180,"context_line":"            # put the method name in the payload so its easier to correlate"},{"line_number":181,"context_line":"            # method name with payload"},{"line_number":182,"context_line":"            auth_data[method_name] \u003d {\u0027protocol\u0027: method_name}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_17532418","line":179,"updated":"2014-08-14 21:34:51.000000000","message":"I find this block here a little confusing. Is there any reason why it\u0027s not just a single \u0027auth_data \u003d {}\u0027 ?","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a4764dd02a5508de0aad86e34fb10292ea877037","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        with mock.patch.object(auth.plugins.mapped.Mapped,"},{"line_number":177,"context_line":"                               \u0027authenticate\u0027,"},{"line_number":178,"context_line":"                               return_value\u003dNone) as authenticate:"},{"line_number":179,"context_line":"            auth_data \u003d {\u0027methods\u0027: [method_name]}"},{"line_number":180,"context_line":"            # put the method name in the payload so its easier to correlate"},{"line_number":181,"context_line":"            # method name with payload"},{"line_number":182,"context_line":"            auth_data[method_name] \u003d {\u0027protocol\u0027: method_name}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_5d269db8","line":179,"in_reply_to":"7ac7a964_17532418","updated":"2014-08-14 22:51:58.000000000","message":"Done","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"add85c48d85b871a609d91dfb2cdf3b95c30533d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # method name with payload"},{"line_number":182,"context_line":"            auth_data[method_name] \u003d {\u0027protocol\u0027: method_name}"},{"line_number":183,"context_line":"            auth_data \u003d {\u0027identity\u0027: auth_data}"},{"line_number":184,"context_line":"            auth_info \u003d auth.controllers.AuthInfo.create(None, auth_data)"},{"line_number":185,"context_line":"            auth_context \u003d {\u0027extras\u0027: {},"},{"line_number":186,"context_line":"                            \u0027method_names\u0027: [],"},{"line_number":187,"context_line":"                            \u0027user_id\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_7c251fc1","line":184,"updated":"2014-08-14 21:34:51.000000000","message":"Can you give None a name?","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a4764dd02a5508de0aad86e34fb10292ea877037","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # method name with payload"},{"line_number":182,"context_line":"            auth_data[method_name] \u003d {\u0027protocol\u0027: method_name}"},{"line_number":183,"context_line":"            auth_data \u003d {\u0027identity\u0027: auth_data}"},{"line_number":184,"context_line":"            auth_info \u003d auth.controllers.AuthInfo.create(None, auth_data)"},{"line_number":185,"context_line":"            auth_context \u003d {\u0027extras\u0027: {},"},{"line_number":186,"context_line":"                            \u0027method_names\u0027: [],"},{"line_number":187,"context_line":"                            \u0027user_id\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_7d3a79ce","line":184,"in_reply_to":"7ac7a964_7c251fc1","updated":"2014-08-14 22:51:58.000000000","message":"Done","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"add85c48d85b871a609d91dfb2cdf3b95c30533d","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                            \u0027user_id\u0027: uuid.uuid4().hex}"},{"line_number":188,"context_line":"            self.api.authenticate({\u0027environment\u0027: {}}, auth_info, auth_context)"},{"line_number":189,"context_line":"            # make sure Mapped plugin got invoked with the correct payload"},{"line_number":190,"context_line":"            ((context, auth_payload, auth_context),"},{"line_number":191,"context_line":"             kwargs) \u003d authenticate.call_args"},{"line_number":192,"context_line":"            self.assertEqual(auth_payload[\u0027protocol\u0027], method_name)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_976f3492","line":190,"updated":"2014-08-14 21:34:51.000000000","message":"This looks weird to me.","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"add85c48d85b871a609d91dfb2cdf3b95c30533d","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            # make sure Mapped plugin got invoked with the correct payload"},{"line_number":190,"context_line":"            ((context, auth_payload, auth_context),"},{"line_number":191,"context_line":"             kwargs) \u003d authenticate.call_args"},{"line_number":192,"context_line":"            self.assertEqual(auth_payload[\u0027protocol\u0027], method_name)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_supporting_multiple_methods(self):"},{"line_number":195,"context_line":"        for method_name in [\u0027saml2\u0027, \u0027openid\u0027, \u0027x509\u0027]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_f75ea8e8","line":192,"updated":"2014-08-14 21:34:51.000000000","message":"Switch the order of these arguments. It should be (expected, observed).","commit_id":"698926e6bc7de008e999973ba64957afb422904a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a4764dd02a5508de0aad86e34fb10292ea877037","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            # make sure Mapped plugin got invoked with the correct payload"},{"line_number":190,"context_line":"            ((context, auth_payload, auth_context),"},{"line_number":191,"context_line":"             kwargs) \u003d authenticate.call_args"},{"line_number":192,"context_line":"            self.assertEqual(auth_payload[\u0027protocol\u0027], method_name)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_supporting_multiple_methods(self):"},{"line_number":195,"context_line":"        for method_name in [\u0027saml2\u0027, \u0027openid\u0027, \u0027x509\u0027]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ac7a964_3d6f21c7","line":192,"in_reply_to":"7ac7a964_f75ea8e8","updated":"2014-08-14 22:51:58.000000000","message":"Done","commit_id":"698926e6bc7de008e999973ba64957afb422904a"}]}
