)]}'
{"keystoneclient/contrib/auth/v3/saml2.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a99c106d89dac1a69d67828fcc90f2d8600c135d","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class _BaseSaml2Auth(v3._AuthConstructor):"},{"line_number":22,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":23,"context_line":"        super(_BaseSaml2Auth, self).__init__(*args, **kwargs)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def flatten_list(self, _list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_fb3790e2","line":22,"updated":"2014-06-16 16:14:39.000000000","message":"Is this actually needed?","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a99c106d89dac1a69d67828fcc90f2d8600c135d","unresolved":false,"context_lines":[{"line_number":446,"context_line":"    _auth_method_class \u003d Saml2ScopedTokenMethod"},{"line_number":447,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    @utils.positional(2)"},{"line_number":450,"context_line":"    def __init__(self, auth_url, unscoped_auth\u003dNone,"},{"line_number":451,"context_line":"                 project_id\u003dNone, domain_id\u003dNone, **kwargs):"},{"line_number":452,"context_line":"        super(Saml2ScopedToken, self).__init__("}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_1b3c3cbf","line":449,"updated":"2014-06-16 16:14:39.000000000","message":"Is 2 correct here? Do we have to account for self as a positional arg?","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"90f1929fc475c9006e59a36650381f07811ad111","unresolved":false,"context_lines":[{"line_number":446,"context_line":"    _auth_method_class \u003d Saml2ScopedTokenMethod"},{"line_number":447,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    @utils.positional(2)"},{"line_number":450,"context_line":"    def __init__(self, auth_url, unscoped_auth\u003dNone,"},{"line_number":451,"context_line":"                 project_id\u003dNone, domain_id\u003dNone, **kwargs):"},{"line_number":452,"context_line":"        super(Saml2ScopedToken, self).__init__("}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_b2031375","line":449,"in_reply_to":"1ae5cdf2_1b3c3cbf","updated":"2014-06-18 12:12:30.000000000","message":"changed to utils.positional.method(1) where indeed \u0027self\u0027 is not taken into account.","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a99c106d89dac1a69d67828fcc90f2d8600c135d","unresolved":false,"context_lines":[{"line_number":456,"context_line":"    def _list_accessible_entities(self, session, key):"},{"line_number":457,"context_line":"        \"\"\"Get accessible entities available for unscoped token.\"\"\""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        url \u003d self.auth_url.rstrip(\u0027/\u0027) + \u0027/OS-FEDERATION/\u0027 + key"},{"line_number":460,"context_line":"        headers \u003d {\u0027X-Auth-Token\u0027: self.unscoped_auth.token}"},{"line_number":461,"context_line":"        resp \u003d session.get(url, headers\u003dheaders, verify\u003dFalse)"},{"line_number":462,"context_line":"        if not resp.ok:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_42f6d891","line":459,"updated":"2014-06-16 16:14:39.000000000","message":"Just a thought: why not validate against a known set of keys to avoid the service call for invalid keys?","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"90f1929fc475c9006e59a36650381f07811ad111","unresolved":false,"context_lines":[{"line_number":456,"context_line":"    def _list_accessible_entities(self, session, key):"},{"line_number":457,"context_line":"        \"\"\"Get accessible entities available for unscoped token.\"\"\""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        url \u003d self.auth_url.rstrip(\u0027/\u0027) + \u0027/OS-FEDERATION/\u0027 + key"},{"line_number":460,"context_line":"        headers \u003d {\u0027X-Auth-Token\u0027: self.unscoped_auth.token}"},{"line_number":461,"context_line":"        resp \u003d session.get(url, headers\u003dheaders, verify\u003dFalse)"},{"line_number":462,"context_line":"        if not resp.ok:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_598eab28","line":459,"in_reply_to":"1ae5cdf2_42f6d891","updated":"2014-06-18 12:12:30.000000000","message":"I can do that, but since this function should be considered protected/private shouldn\u0027t we assume people know what they do?","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a99c106d89dac1a69d67828fcc90f2d8600c135d","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        ident.setdefault(\u0027methods\u0027, []).append(name)"},{"line_number":503,"context_line":"        ident[name] \u003d auth_data"},{"line_number":504,"context_line":"        if not ident:"},{"line_number":505,"context_line":"            raise exceptions.AuthorizationFailure(\u0027Authentication method \u0027"},{"line_number":506,"context_line":"                                                  \u0027required (e.g. saml2)\u0027)"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_827540fc","line":504,"updated":"2014-06-16 16:14:39.000000000","message":"Can this ever happen? You are adding a methods key to ident 2 lines up.","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"90f1929fc475c9006e59a36650381f07811ad111","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        ident.setdefault(\u0027methods\u0027, []).append(name)"},{"line_number":503,"context_line":"        ident[name] \u003d auth_data"},{"line_number":504,"context_line":"        if not ident:"},{"line_number":505,"context_line":"            raise exceptions.AuthorizationFailure(\u0027Authentication method \u0027"},{"line_number":506,"context_line":"                                                  \u0027required (e.g. saml2)\u0027)"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_39ec7fbb","line":504,"in_reply_to":"1ae5cdf2_827540fc","updated":"2014-06-18 12:12:30.000000000","message":"good catch, removed.","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a99c106d89dac1a69d67828fcc90f2d8600c135d","unresolved":false,"context_lines":[{"line_number":522,"context_line":"        try:"},{"line_number":523,"context_line":"            scoped_token \u003d response.json()[\u0027token\u0027]"},{"line_number":524,"context_line":"            scoped_token_id \u003d response.headers[\u0027X-Subject-Token\u0027]"},{"line_number":525,"context_line":"        except (KeyError, ValueError):"},{"line_number":526,"context_line":"            raise exceptions.InvalidResponse(response\u003dresponse)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        return access.AccessInfoV3(scoped_token_id, **scoped_token)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_c21028ae","line":525,"updated":"2014-06-16 16:14:39.000000000","message":"What can cause the ValueError here? Maybe bad JSON response? Is there a test for this?","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"90f1929fc475c9006e59a36650381f07811ad111","unresolved":false,"context_lines":[{"line_number":522,"context_line":"        try:"},{"line_number":523,"context_line":"            scoped_token \u003d response.json()[\u0027token\u0027]"},{"line_number":524,"context_line":"            scoped_token_id \u003d response.headers[\u0027X-Subject-Token\u0027]"},{"line_number":525,"context_line":"        except (KeyError, ValueError):"},{"line_number":526,"context_line":"            raise exceptions.InvalidResponse(response\u003dresponse)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        return access.AccessInfoV3(scoped_token_id, **scoped_token)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_b99b2f65","line":525,"in_reply_to":"1ae5cdf2_c21028ae","updated":"2014-06-18 12:12:30.000000000","message":"Yes, json() can raise ValueError exception.\nYes, there is a test for this: \ntest_scope_saml2_invalid_response_invalid_body() where an empty body is returned (also not jsonizable). However, the object using this plugin should expect InvalidResponse exception.","commit_id":"4728be98adf8534ec28d0e5821939a12b131b92a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"573585388dc81b63b5b9a68738c0995f4197d8b1","unresolved":false,"context_lines":[{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        headers \u003d {\u0027X-Auth-Token\u0027: self.unscoped_auth.token}"},{"line_number":465,"context_line":"        resp \u003d session.get(url, headers\u003dheaders, verify\u003dFalse)"},{"line_number":466,"context_line":"        msg \u003d None"},{"line_number":467,"context_line":"        entities \u003d None"},{"line_number":468,"context_line":"        if not resp.ok:"},{"line_number":469,"context_line":"            raise exceptions.InvalidResponse(resp.reason)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_dfa7bbba","line":466,"updated":"2014-06-18 13:30:27.000000000","message":"This is not necessary.","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"47b85b31698b1aeb5bf51d8e5789a45c7d5afded","unresolved":false,"context_lines":[{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        headers \u003d {\u0027X-Auth-Token\u0027: self.unscoped_auth.token}"},{"line_number":465,"context_line":"        resp \u003d session.get(url, headers\u003dheaders, verify\u003dFalse)"},{"line_number":466,"context_line":"        msg \u003d None"},{"line_number":467,"context_line":"        entities \u003d None"},{"line_number":468,"context_line":"        if not resp.ok:"},{"line_number":469,"context_line":"            raise exceptions.InvalidResponse(resp.reason)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_e8659a45","line":466,"in_reply_to":"1ae5cdf2_dfa7bbba","updated":"2014-06-18 16:15:41.000000000","message":"removed","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"573585388dc81b63b5b9a68738c0995f4197d8b1","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        headers \u003d {\u0027X-Auth-Token\u0027: self.unscoped_auth.token}"},{"line_number":465,"context_line":"        resp \u003d session.get(url, headers\u003dheaders, verify\u003dFalse)"},{"line_number":466,"context_line":"        msg \u003d None"},{"line_number":467,"context_line":"        entities \u003d None"},{"line_number":468,"context_line":"        if not resp.ok:"},{"line_number":469,"context_line":"            raise exceptions.InvalidResponse(resp.reason)"},{"line_number":470,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_ffac77a1","line":467,"updated":"2014-06-18 13:30:27.000000000","message":"This is also not necessary.","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"47b85b31698b1aeb5bf51d8e5789a45c7d5afded","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        headers \u003d {\u0027X-Auth-Token\u0027: self.unscoped_auth.token}"},{"line_number":465,"context_line":"        resp \u003d session.get(url, headers\u003dheaders, verify\u003dFalse)"},{"line_number":466,"context_line":"        msg \u003d None"},{"line_number":467,"context_line":"        entities \u003d None"},{"line_number":468,"context_line":"        if not resp.ok:"},{"line_number":469,"context_line":"            raise exceptions.InvalidResponse(resp.reason)"},{"line_number":470,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_285ce27c","line":467,"in_reply_to":"1ae5cdf2_ffac77a1","updated":"2014-06-18 16:15:41.000000000","message":"removed, oh I was trying to make other structure of the code and later gave up on that.....this indeed shouldn\u0027t be here :/","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"573585388dc81b63b5b9a68738c0995f4197d8b1","unresolved":false,"context_lines":[{"line_number":512,"context_line":"        ident.setdefault(\u0027methods\u0027, []).append(name)"},{"line_number":513,"context_line":"        ident[name] \u003d auth_data"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        mutual_exclusion \u003d bool(self.project_id) !\u003d bool(self.domain_id)"},{"line_number":516,"context_line":"        if mutual_exclusion is False:"},{"line_number":517,"context_line":"            projects \u003d self._list_projects(session)"},{"line_number":518,"context_line":"            domains \u003d self._list_domains(session)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_5fe1eb99","line":515,"updated":"2014-06-18 13:30:27.000000000","message":"Is this really saying \u0027if self.project_id and self.domain_id\u0027? If this object really shouldn\u0027t have both set would it make more sense to raise the exception from the __init__ or are there situations where you\u0027d want both set in the object?","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"47b85b31698b1aeb5bf51d8e5789a45c7d5afded","unresolved":false,"context_lines":[{"line_number":512,"context_line":"        ident.setdefault(\u0027methods\u0027, []).append(name)"},{"line_number":513,"context_line":"        ident[name] \u003d auth_data"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        mutual_exclusion \u003d bool(self.project_id) !\u003d bool(self.domain_id)"},{"line_number":516,"context_line":"        if mutual_exclusion is False:"},{"line_number":517,"context_line":"            projects \u003d self._list_projects(session)"},{"line_number":518,"context_line":"            domains \u003d self._list_domains(session)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_08e566a3","line":515,"in_reply_to":"1ae5cdf2_5fe1eb99","updated":"2014-06-18 16:15:41.000000000","message":"The goal for this condition is: is only one variable logically True.\n\nThis plugin should follow a standard usecases, so I think token should be scoped either to domain_id or project_id, not both.\n\nI am also going to add tests to cover this logic.","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"206e1bf1577149070f49d3298814d923481ed074","unresolved":false,"context_lines":[{"line_number":513,"context_line":"        ident[name] \u003d auth_data"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        mutual_exclusion \u003d bool(self.project_id) !\u003d bool(self.domain_id)"},{"line_number":516,"context_line":"        if mutual_exclusion is False:"},{"line_number":517,"context_line":"            projects \u003d self._list_projects(session)"},{"line_number":518,"context_line":"            domains \u003d self._list_domains(session)"},{"line_number":519,"context_line":"            raise exceptions.ScopingTokenError(projects\u003dprojects,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_99eaa6d6","line":516,"updated":"2014-06-18 16:47:37.000000000","message":"The logic will be easier to understand if you do the following.\n\n1.  Remove the mutual_exclusion variable entirely.\n\n2.  Replace the if with the following.\n\nif bool(self.project_id) \u003d\u003d bool(self.domain_id):","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d6259b4b77e326e491afd366317e9870f9558fd6","unresolved":false,"context_lines":[{"line_number":513,"context_line":"        ident[name] \u003d auth_data"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        mutual_exclusion \u003d bool(self.project_id) !\u003d bool(self.domain_id)"},{"line_number":516,"context_line":"        if mutual_exclusion is False:"},{"line_number":517,"context_line":"            projects \u003d self._list_projects(session)"},{"line_number":518,"context_line":"            domains \u003d self._list_domains(session)"},{"line_number":519,"context_line":"            raise exceptions.ScopingTokenError(projects\u003dprojects,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_d9f34e71","line":516,"in_reply_to":"1ae5cdf2_99eaa6d6","updated":"2014-06-18 16:59:20.000000000","message":"David: Thanks, just noticed your hint.\nActually I splitted it into two parts:\n\n1) If both project_id and domain_id are set, the plugin will complain in __init__() by raising an exception\n\n2) If none of project_id and domain_id is set, it will call OS-FEDERATION/projects and OS-FEDERATION/domains, fetch entities accrodingly and only then raise an ScopingTokenError exception with projects/domains stored within the exception objects.\n\nMakes sense?","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3b578e8106c07318d091d8dad202938c7261436b","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        return self._method_name, saml2"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"class Saml2ScopedToken(v3.Token, _BaseSaml2Auth):"},{"line_number":431,"context_line":"    \"\"\"Class for scoping unscoped saml2 token.\"\"\""},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    _auth_method_class \u003d Saml2ScopedTokenMethod"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_e4c7f844","line":430,"updated":"2014-07-16 08:40:51.000000000","message":"v3.Token? why not v3.Auth? or AuthConstructor if you are using methods?","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2337df724664218506c7435cbe60af2d06f089df","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @utils.positional.method(2)"},{"line_number":438,"context_line":"    def __init__(self, auth_url, token,"},{"line_number":439,"context_line":"                 project_id\u003dNone, domain_id\u003dNone, **kwargs):"},{"line_number":440,"context_line":"        super(Saml2ScopedToken, self).__init__("},{"line_number":441,"context_line":"            auth_url, token, project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_793ab199","line":438,"updated":"2014-07-16 03:53:46.000000000","message":"I had assumed this was not just a token ID, so in my script, I had done:\n\n  unscoped_token \u003d unscoped_plugin.get_auth_ref(my_sess)\n  print(unscoped_token)\n\n  scoped_plugin \u003d saml2.Saml2ScopedToken(auth_url, unscoped_token)\n\nBut in the code, it\u0027s actually looking for just the token ID.\nIn my example above, i\u0027m supplying the entire dictionary.\nIs there a specific direction we want to go for this? If it\u0027s the object or dict, we can do some checking anyway before just passing in self.token. when get_auth_data is called","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a7b429595fa54a05ea63c161531dfd7d3782613","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @utils.positional.method(2)"},{"line_number":438,"context_line":"    def __init__(self, auth_url, token,"},{"line_number":439,"context_line":"                 project_id\u003dNone, domain_id\u003dNone, **kwargs):"},{"line_number":440,"context_line":"        super(Saml2ScopedToken, self).__init__("},{"line_number":441,"context_line":"            auth_url, token, project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_ea7fbe64","line":438,"in_reply_to":"baada198_793ab199","updated":"2014-07-16 08:11:15.000000000","message":"This plugin inherits from v3.Token, and if we look at it\u0027s code is accepts token ID (or the encoded PKI token), not the V3Access object: https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/auth/identity/v3.py#L252\n\nYou should call your scoping token plugin with:\n\nscoped_plugin \u003d saml2.Saml2ScopedToken(auth_url, unscoped_token.auth_token)","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2337df724664218506c7435cbe60af2d06f089df","unresolved":false,"context_lines":[{"line_number":450,"context_line":"    def _list_accessible_entities(self, session, key):"},{"line_number":451,"context_line":"        \"\"\"Get accessible entities available for unscoped token.\"\"\""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        if key not in self._keys:"},{"line_number":454,"context_line":"            msg \u003d \"Entity key must be one of [%s], instead of %s\" % ("},{"line_number":455,"context_line":"                  \u0027, \u0027.join(self._keys), key)"},{"line_number":456,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_d9ac9df1","line":453,"updated":"2014-07-16 03:53:46.000000000","message":"is this block really necessary? it\u0027s a private function and you are always supplying projects or domains.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a7b429595fa54a05ea63c161531dfd7d3782613","unresolved":false,"context_lines":[{"line_number":450,"context_line":"    def _list_accessible_entities(self, session, key):"},{"line_number":451,"context_line":"        \"\"\"Get accessible entities available for unscoped token.\"\"\""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        if key not in self._keys:"},{"line_number":454,"context_line":"            msg \u003d \"Entity key must be one of [%s], instead of %s\" % ("},{"line_number":455,"context_line":"                  \u0027, \u0027.join(self._keys), key)"},{"line_number":456,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_477503f9","line":453,"in_reply_to":"baada198_d9ac9df1","updated":"2014-07-16 08:11:15.000000000","message":"I had also assumed user should know what he is doing since it\u0027s private method (well, \u0027named\u0027 as private...), but it was Stanek\u0027s suggestion.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3b578e8106c07318d091d8dad202938c7261436b","unresolved":false,"context_lines":[{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        saml2_method \u003d self._first(self.auth_methods)"},{"line_number":507,"context_line":"        name, auth_data \u003d saml2_method.get_auth_data("},{"line_number":508,"context_line":"            session, self.token, headers)"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        ident.setdefault(\u0027methods\u0027, []).append(name)"},{"line_number":511,"context_line":"        ident[name] \u003d auth_data"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_84071c81","line":508,"updated":"2014-07-16 08:40:51.000000000","message":"This seems unnecessary. \n\nThe ONLY reason to have methods is so that you can combine multiple methods together when authenticating. Like for example user/pass and token - nothing i know of does this but it\u0027s always been allowed. \n\nIf you have to specifically check that the only method that is present is the one you want then you should just override the Auth class and set the methods yourself. \n\nThis is the difference between Token and TokenMethod for example. Token means you use only a token, a TokenMethod can be combined with other Methods.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2337df724664218506c7435cbe60af2d06f089df","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"            domains_key, domains \u003d self._list_domains(session)"},{"line_number":522,"context_line":"            domains \u003d domains[domains_key]"},{"line_number":523,"context_line":"            raise exceptions.ScopingTokenError(projects\u003dprojects,"},{"line_number":524,"context_line":"                                               domains\u003ddomains)"},{"line_number":525,"context_line":"        if self.domain_id:"},{"line_number":526,"context_line":"            body[\u0027auth\u0027][\u0027scope\u0027] \u003d {\u0027domain\u0027: {\u0027id\u0027: self.domain_id}}"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_1901b5af","line":523,"updated":"2014-07-16 03:53:46.000000000","message":"This doesn\u0027t seem to work correctly. Should I be seeing a list of projects and domains I have access to?\n\nthe projects variable actually has data, it\u0027s just not being surfaced at the command line.\n\nI\u0027m just seeing:\n\nTraceback (most recent call last):\n  File \"fed_example.py\", line 45, in \u003cmodule\u003e\n    initialize()\n  File \"fed_example.py\", line 40, in initialize\n    data \u003d scoped_plugin.get_auth_ref(my_session)\n  File \"/opt/stack/python-keystoneclient/keystoneclient/contrib/auth/v3/saml2.py\", line 526, in get_auth_ref\n    domains\u003ddomains)\nkeystoneclient.exceptions.ScopingTokenError\n\nI thought I would see projects and domains too.\n\nMaybe add a test for this too?","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a7b429595fa54a05ea63c161531dfd7d3782613","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"            domains_key, domains \u003d self._list_domains(session)"},{"line_number":522,"context_line":"            domains \u003d domains[domains_key]"},{"line_number":523,"context_line":"            raise exceptions.ScopingTokenError(projects\u003dprojects,"},{"line_number":524,"context_line":"                                               domains\u003ddomains)"},{"line_number":525,"context_line":"        if self.domain_id:"},{"line_number":526,"context_line":"            body[\u0027auth\u0027][\u0027scope\u0027] \u003d {\u0027domain\u0027: {\u0027id\u0027: self.domain_id}}"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_67e04797","line":523,"in_reply_to":"baada198_1901b5af","updated":"2014-07-16 08:11:15.000000000","message":"You want to projects and domains in the stacktrace?\nI was expecting user to catch this exception and simply look what\u0027s inside \u0027projects\u0027 and \u0027domains\u0027 attributes (which contains list of accessible projects and domains).\nAnd the test for my scenario is already in the testset: see line ~448-ish in https://review.openstack.org/#/c/99704/13/keystoneclient/tests/v3/test_auth_saml2.py","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3b578e8106c07318d091d8dad202938c7261436b","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"            domains_key, domains \u003d self._list_domains(session)"},{"line_number":522,"context_line":"            domains \u003d domains[domains_key]"},{"line_number":523,"context_line":"            raise exceptions.ScopingTokenError(projects\u003dprojects,"},{"line_number":524,"context_line":"                                               domains\u003ddomains)"},{"line_number":525,"context_line":"        if self.domain_id:"},{"line_number":526,"context_line":"            body[\u0027auth\u0027][\u0027scope\u0027] \u003d {\u0027domain\u0027: {\u0027id\u0027: self.domain_id}}"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_e4a0d893","line":523,"in_reply_to":"baada198_1901b5af","updated":"2014-07-16 08:40:51.000000000","message":"does it make sense to do this here do you think? \n\nI would have thought you could list projects and domains associated with a token as part of the unscoped token, and by the time you create the scoped token you should already know what you are looking to scope to.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b2d75a44f7ee51f68bfa3be0b74470b963e336e8","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"},{"line_number":423,"context_line":"        \"\"\"Build and return request body for token scoping step.\"\"\""},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        _, token \u003d super(Saml2ScopedTokenMethod, self).get_auth_data("},{"line_number":426,"context_line":"            session, auth, headers, **kwargs)"},{"line_number":427,"context_line":"        return self._method_name, token"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_00d59fb8","line":425,"updated":"2014-07-16 15:17:56.000000000","message":"_ should be change to something more readable like _name. We have been asking for this in more and more patches.","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cbb05997c432160c79c59606542738110a9a3214","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"},{"line_number":423,"context_line":"        \"\"\"Build and return request body for token scoping step.\"\"\""},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        _, token \u003d super(Saml2ScopedTokenMethod, self).get_auth_data("},{"line_number":426,"context_line":"            session, auth, headers, **kwargs)"},{"line_number":427,"context_line":"        return self._method_name, token"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_2070e372","line":425,"updated":"2014-07-16 15:11:42.000000000","message":"nit: give _ an actual variable name","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4dcb19f71836addf32bfa4bed67415252a76b776","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"},{"line_number":423,"context_line":"        \"\"\"Build and return request body for token scoping step.\"\"\""},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        _, token \u003d super(Saml2ScopedTokenMethod, self).get_auth_data("},{"line_number":426,"context_line":"            session, auth, headers, **kwargs)"},{"line_number":427,"context_line":"        return self._method_name, token"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_80627314","line":425,"in_reply_to":"baada198_00d59fb8","updated":"2014-07-17 07:08:37.000000000","message":"ahhh, I like \u0027_\u0027 very much :(","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b2d75a44f7ee51f68bfa3be0b74470b963e336e8","unresolved":false,"context_lines":[{"line_number":431,"context_line":"    \"\"\"Class for scoping unscoped saml2 token.\"\"\""},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    _auth_method_class \u003d Saml2ScopedTokenMethod"},{"line_number":434,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def __init__(self, auth_url, token, **kwargs):"},{"line_number":437,"context_line":"        super(Saml2ScopedToken, self).__init__(auth_url, token, **kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_a0615313","line":434,"updated":"2014-07-16 15:17:56.000000000","message":"What actually uses PROTOCOL?","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4dcb19f71836addf32bfa4bed67415252a76b776","unresolved":false,"context_lines":[{"line_number":431,"context_line":"    \"\"\"Class for scoping unscoped saml2 token.\"\"\""},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    _auth_method_class \u003d Saml2ScopedTokenMethod"},{"line_number":434,"context_line":"    PROTOCOL \u003d \u0027saml2\u0027"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def __init__(self, auth_url, token, **kwargs):"},{"line_number":437,"context_line":"        super(Saml2ScopedToken, self).__init__(auth_url, token, **kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_607b9fbe","line":434,"in_reply_to":"baada198_a0615313","updated":"2014-07-17 07:08:37.000000000","message":"nothing anymore, removed","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"032584056c8bd7387e7b24059ce447d0ca20f4ba","unresolved":false,"context_lines":[{"line_number":416,"context_line":""},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"class Saml2ScopedTokenMethod(v3.TokenMethod):"},{"line_number":419,"context_line":"    _method_parameters \u003d [\u0027token\u0027]"},{"line_number":420,"context_line":"    _method_name \u003d \u0027saml2\u0027"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_eba4c409","line":419,"updated":"2014-07-18 03:53:24.000000000","message":"same as underyling","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"0ccd2c2c0f70ad59af44ac110a910c2d7807bdcd","unresolved":false,"context_lines":[{"line_number":416,"context_line":""},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"class Saml2ScopedTokenMethod(v3.TokenMethod):"},{"line_number":419,"context_line":"    _method_parameters \u003d [\u0027token\u0027]"},{"line_number":420,"context_line":"    _method_name \u003d \u0027saml2\u0027"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_c8b29f95","line":419,"in_reply_to":"baada198_eba4c409","updated":"2014-07-18 09:46:27.000000000","message":"right, removed.","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"032584056c8bd7387e7b24059ce447d0ca20f4ba","unresolved":false,"context_lines":[{"line_number":417,"context_line":""},{"line_number":418,"context_line":"class Saml2ScopedTokenMethod(v3.TokenMethod):"},{"line_number":419,"context_line":"    _method_parameters \u003d [\u0027token\u0027]"},{"line_number":420,"context_line":"    _method_name \u003d \u0027saml2\u0027"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"},{"line_number":423,"context_line":"        \"\"\"Build and return request body for token scoping step.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_0ba818da","line":420,"updated":"2014-07-18 03:53:24.000000000","message":"pity we need this change of name method name. I was hoping that the unscoped -\u003e scoped token was the same conversion for federation.","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"0ccd2c2c0f70ad59af44ac110a910c2d7807bdcd","unresolved":false,"context_lines":[{"line_number":417,"context_line":""},{"line_number":418,"context_line":"class Saml2ScopedTokenMethod(v3.TokenMethod):"},{"line_number":419,"context_line":"    _method_parameters \u003d [\u0027token\u0027]"},{"line_number":420,"context_line":"    _method_name \u003d \u0027saml2\u0027"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def get_auth_data(self, session, auth, headers, **kwargs):"},{"line_number":423,"context_line":"        \"\"\"Build and return request body for token scoping step.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_884a6781","line":420,"in_reply_to":"baada198_0ba818da","updated":"2014-07-18 09:46:27.000000000","message":"no, it\u0027s not mainly due to different mining of the tied roles (directly from the group list stored in the token). \nI don\u0027t think we can do anything about that at the moment.","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"032584056c8bd7387e7b24059ce447d0ca20f4ba","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        t \u003d super(Saml2ScopedTokenMethod, self).get_auth_data("},{"line_number":426,"context_line":"            session, auth, headers, **kwargs)"},{"line_number":427,"context_line":"        _token_method, token \u003d t"},{"line_number":428,"context_line":"        return self._method_name, token"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"class Saml2ScopedToken(v3.Token, _BaseSaml2Auth):"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_ab9accc2","line":428,"updated":"2014-07-18 03:53:24.000000000","message":"You could do the _method_name thing on v3.Token","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"0ccd2c2c0f70ad59af44ac110a910c2d7807bdcd","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        t \u003d super(Saml2ScopedTokenMethod, self).get_auth_data("},{"line_number":426,"context_line":"            session, auth, headers, **kwargs)"},{"line_number":427,"context_line":"        _token_method, token \u003d t"},{"line_number":428,"context_line":"        return self._method_name, token"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"class Saml2ScopedToken(v3.Token, _BaseSaml2Auth):"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_d1b086ff","line":428,"in_reply_to":"baada198_ab9accc2","updated":"2014-07-18 09:46:27.000000000","message":"I am more a fan of doing this in AuthMethod module, so the outer plugin class can remain the same.","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"032584056c8bd7387e7b24059ce447d0ca20f4ba","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        return self._method_name, token"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"class Saml2ScopedToken(v3.Token, _BaseSaml2Auth):"},{"line_number":432,"context_line":"    \"\"\"Class for scoping unscoped saml2 token.\"\"\""},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    _auth_method_class \u003d Saml2ScopedTokenMethod"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_ab4c8c77","line":431,"updated":"2014-07-18 03:53:24.000000000","message":"what does _BaseSaml2Auth Give you?","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"032584056c8bd7387e7b24059ce447d0ca20f4ba","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        super(Saml2ScopedToken, self).__init__(auth_url, token, **kwargs)"},{"line_number":438,"context_line":"        if not (self.project_id or self.domain_id):"},{"line_number":439,"context_line":"            raise exceptions.ValidationError("},{"line_number":440,"context_line":"                \"Neither project nor domain specified\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_4ba930dc","line":440,"updated":"2014-07-18 03:53:24.000000000","message":"single quotes for strings","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"0ccd2c2c0f70ad59af44ac110a910c2d7807bdcd","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        super(Saml2ScopedToken, self).__init__(auth_url, token, **kwargs)"},{"line_number":438,"context_line":"        if not (self.project_id or self.domain_id):"},{"line_number":439,"context_line":"            raise exceptions.ValidationError("},{"line_number":440,"context_line":"                \"Neither project nor domain specified\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"baada198_6828b397","line":440,"in_reply_to":"baada198_4ba930dc","updated":"2014-07-18 09:46:27.000000000","message":"done","commit_id":"66dda6787b425a7f2277992feb45bdcd78e1d9ad"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"393dc476538b8ade38e7e73d2c181f6ceca7e9f2","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient import exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class _BaseSaml2Auth(v3.AuthConstructor):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    @staticmethod"},{"line_number":24,"context_line":"    def _first(_list):"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_31fcbb3f","line":21,"updated":"2014-07-22 19:53:12.000000000","message":"Pulling this out is not a part of this patch any more.","commit_id":"054ea9511f501d34f952914796735b7d078b2968"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"fe75dee7d79695f0f2cf19c5a3515ecacdd8204d","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _first(self, _list):"},{"line_number":143,"context_line":"        if len(_list) !\u003d 1:"},{"line_number":144,"context_line":"            raise IndexError(\"Only single element is acceptable\")"},{"line_number":145,"context_line":"        return _list[0]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def _prepare_idp_saml2_request(self, saml2_authn_request):"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_4caef182","line":144,"updated":"2014-07-22 23:48:17.000000000","message":"nit: different patch","commit_id":"c758a2fc506f6687fd6234ff6e662185a010d642"}],"keystoneclient/exceptions.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b2d75a44f7ee51f68bfa3be0b74470b963e336e8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"class ScopingTokenError(ClientException):"},{"line_number":87,"context_line":"        def __init__(self, projects, domains):"},{"line_number":88,"context_line":"            super(ScopingTokenError, self).__init__()"},{"line_number":89,"context_line":"            self.projects \u003d projects"},{"line_number":90,"context_line":"            self.domains \u003d domains"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_c02f273d","line":89,"updated":"2014-07-16 15:17:56.000000000","message":"Do these get used anywhere?","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4dcb19f71836addf32bfa4bed67415252a76b776","unresolved":false,"context_lines":[{"line_number":86,"context_line":"class ScopingTokenError(ClientException):"},{"line_number":87,"context_line":"        def __init__(self, projects, domains):"},{"line_number":88,"context_line":"            super(ScopingTokenError, self).__init__()"},{"line_number":89,"context_line":"            self.projects \u003d projects"},{"line_number":90,"context_line":"            self.domains \u003d domains"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_9bfe6404","line":89,"in_reply_to":"baada198_c02f273d","updated":"2014-07-17 07:08:37.000000000","message":"not in this patch.","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"}],"keystoneclient/tests/v3/saml2_fixtures.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cb7b60bfcdc1ecbc2fdaabbe31f08d56bc160ca6","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"SCOPED_TOKEN \u003d \u0027SCOPED_TOKEN\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"SCOPED_RESPONSE_HEADER \u003d {"},{"line_number":126,"context_line":"    \u0027X-Subject-Token\u0027: SCOPED_TOKEN"},{"line_number":127,"context_line":"}"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_399af96e","line":125,"updated":"2014-07-16 04:00:58.000000000","message":"could just use: \n\nhttps://github.com/openstack/python-keystoneclient/blob/02572377fa673a7e453ccdcab52ec3bd93d77da3/keystoneclient/tests/v3/client_fixtures.py#L124","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a7b429595fa54a05ea63c161531dfd7d3782613","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"SCOPED_TOKEN \u003d \u0027SCOPED_TOKEN\u0027"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"SCOPED_RESPONSE_HEADER \u003d {"},{"line_number":126,"context_line":"    \u0027X-Subject-Token\u0027: SCOPED_TOKEN"},{"line_number":127,"context_line":"}"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_caf11a03","line":125,"in_reply_to":"baada198_399af96e","updated":"2014-07-16 08:11:15.000000000","message":"yeah...","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cb7b60bfcdc1ecbc2fdaabbe31f08d56bc160ca6","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \u0027X-Subject-Token\u0027: SCOPED_TOKEN"},{"line_number":127,"context_line":"}"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"PROJECTS \u003d {"},{"line_number":130,"context_line":"    \"projects\": ["},{"line_number":131,"context_line":"        {"},{"line_number":132,"context_line":"            \"domain_id\": \"37ef61\","}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_798b911e","line":129,"updated":"2014-07-16 04:00:58.000000000","message":"I\u0027m tempted to say that these are generic enough to go here (https://github.com/openstack/python-keystoneclient/blob/02572377fa673a7e453ccdcab52ec3bd93d77da3/keystoneclient/tests/v3/client_fixtures.py#L124) too.\n\nBut i will defer to Jamie.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3b578e8106c07318d091d8dad202938c7261436b","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \u0027X-Subject-Token\u0027: SCOPED_TOKEN"},{"line_number":127,"context_line":"}"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"PROJECTS \u003d {"},{"line_number":130,"context_line":"    \"projects\": ["},{"line_number":131,"context_line":"        {"},{"line_number":132,"context_line":"            \"domain_id\": \"37ef61\","}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_05494332","line":129,"in_reply_to":"baada198_798b911e","updated":"2014-07-16 08:40:51.000000000","message":"I don\u0027t mind, is it the same format as /v3/projects? If it\u0027s a federation specific data structure it\u0027s fine to be here.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"3a7b429595fa54a05ea63c161531dfd7d3782613","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \u0027X-Subject-Token\u0027: SCOPED_TOKEN"},{"line_number":127,"context_line":"}"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"PROJECTS \u003d {"},{"line_number":130,"context_line":"    \"projects\": ["},{"line_number":131,"context_line":"        {"},{"line_number":132,"context_line":"            \"domain_id\": \"37ef61\","}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_8ae72246","line":129,"in_reply_to":"baada198_798b911e","updated":"2014-07-16 08:11:15.000000000","message":"ok, not moving from here until Jamie states his opinion.","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"}],"keystoneclient/tests/v3/test_auth_saml2.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"573585388dc81b63b5b9a68738c0995f4197d8b1","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        }"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    @httpretty.activate"},{"line_number":264,"context_line":"    def test_scope_saml2_token(self):"},{"line_number":265,"context_line":"        self.simple_http(\u0027POST\u0027, self.TEST_URL + \u0027/auth/tokens\u0027,"},{"line_number":266,"context_line":"                         body\u003djsonutils.dumps(self.SCOPED_TOKEN_JSON),"},{"line_number":267,"context_line":"                         content_type\u003d\u0027application/json\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_ffa0f743","line":264,"updated":"2014-06-18 13:30:27.000000000","message":"Suggest renaming to \u0027test_scope_saml2_token_to_project\u0027 and adding another test to scope to domain.","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"47b85b31698b1aeb5bf51d8e5789a45c7d5afded","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        }"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    @httpretty.activate"},{"line_number":264,"context_line":"    def test_scope_saml2_token(self):"},{"line_number":265,"context_line":"        self.simple_http(\u0027POST\u0027, self.TEST_URL + \u0027/auth/tokens\u0027,"},{"line_number":266,"context_line":"                         body\u003djsonutils.dumps(self.SCOPED_TOKEN_JSON),"},{"line_number":267,"context_line":"                         content_type\u003d\u0027application/json\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_e8303a58","line":264,"in_reply_to":"1ae5cdf2_ffa0f743","updated":"2014-06-18 16:15:41.000000000","message":"Done","commit_id":"cd79207df1fe02a0afca764c492ca951b0b8b03c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cb7b60bfcdc1ecbc2fdaabbe31f08d56bc160ca6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"baada198_7992b14c","updated":"2014-07-16 04:00:58.000000000","message":"nice job with the tests, very thorough","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3b578e8106c07318d091d8dad202938c7261436b","unresolved":false,"context_lines":[{"line_number":346,"context_line":"            }"},{"line_number":347,"context_line":"        }"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        self.DOMAIN_SCOPED_TOKEN_JSON \u003d {"},{"line_number":350,"context_line":"            \"token\": {"},{"line_number":351,"context_line":"                \"domain\": {"},{"line_number":352,"context_line":"                    \"id\": self.TEST_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_65675fb8","line":349,"updated":"2014-07-16 08:40:51.000000000","message":"use the token generator fixtures","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cbb05997c432160c79c59606542738110a9a3214","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            self.TEST_URL, saml2_fixtures.UNSCOPED_TOKEN_HEADER,"},{"line_number":321,"context_line":"            project_id\u003dself.TEST_TENANT_ID)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        self.PROJECT_SCOPED_TOKEN_JSON \u003d {"},{"line_number":324,"context_line":"            \"token\": {"},{"line_number":325,"context_line":"                \"methods\": ["},{"line_number":326,"context_line":"                    \"saml2\""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_c02e47fa","line":323,"updated":"2014-07-16 15:11:42.000000000","message":"why not call https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/tests/v3/client_fixtures.py#L72 and just hardcode [methods] to \u0027saml2\u0027","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4dcb19f71836addf32bfa4bed67415252a76b776","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            self.TEST_URL, saml2_fixtures.UNSCOPED_TOKEN_HEADER,"},{"line_number":321,"context_line":"            project_id\u003dself.TEST_TENANT_ID)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        self.PROJECT_SCOPED_TOKEN_JSON \u003d {"},{"line_number":324,"context_line":"            \"token\": {"},{"line_number":325,"context_line":"                \"methods\": ["},{"line_number":326,"context_line":"                    \"saml2\""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_5b1f6cb7","line":323,"in_reply_to":"baada198_c02e47fa","updated":"2014-07-17 07:08:37.000000000","message":"changed","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cbb05997c432160c79c59606542738110a9a3214","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            }"},{"line_number":348,"context_line":"        }"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        self.DOMAIN_SCOPED_TOKEN_JSON \u003d {"},{"line_number":351,"context_line":"            \"token\": {"},{"line_number":352,"context_line":"                \"domain\": {"},{"line_number":353,"context_line":"                    \"id\": self.TEST_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_00391f41","line":350,"updated":"2014-07-16 15:11:42.000000000","message":"https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/tests/v3/client_fixtures.py#L26","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4dcb19f71836addf32bfa4bed67415252a76b776","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            }"},{"line_number":348,"context_line":"        }"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        self.DOMAIN_SCOPED_TOKEN_JSON \u003d {"},{"line_number":351,"context_line":"            \"token\": {"},{"line_number":352,"context_line":"                \"domain\": {"},{"line_number":353,"context_line":"                    \"id\": self.TEST_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_7b1a70c7","line":350,"in_reply_to":"baada198_00391f41","updated":"2014-07-17 07:08:37.000000000","message":"changed","commit_id":"e837cc7c2013aa4358f70b8c7ef1b28a66b989d9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4012f218d2b57cee4a86a99c8ee92cad9eec17a1","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        self.DOMAIN_SCOPED_TOKEN_JSON \u003d client_fixtures.domain_scoped_token()"},{"line_number":327,"context_line":"        self.DOMAIN_SCOPED_TOKEN_JSON[\u0027methods\u0027] \u003d [\u0027saml2\u0027]"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        #for better readibility"},{"line_number":330,"context_line":"        self.TEST_DOMAIN_ID \u003d self.DOMAIN_SCOPED_TOKEN_JSON.domain_id"},{"line_number":331,"context_line":"        self.TEST_DOMAIN_NAME \u003d self.DOMAIN_SCOPED_TOKEN_JSON.domain_name"},{"line_number":332,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_cfef53b0","line":329,"updated":"2014-07-23 01:02:45.000000000","message":"nit: should be a space between # and comment","commit_id":"c758a2fc506f6687fd6234ff6e662185a010d642"}],"setup.cfg":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"3b578e8106c07318d091d8dad202938c7261436b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    v3password \u003d keystoneclient.auth.identity.v3:Password"},{"line_number":38,"context_line":"    v3token \u003d keystoneclient.auth.identity.v3:Token"},{"line_number":39,"context_line":"    v3unscopedsaml \u003d keystoneclient.contrib.auth.v3.saml2:Saml2UnscopedToken"},{"line_number":40,"context_line":"    v3scopedsaml \u003d keystoneclient.contrib.auth.v3.saml2:Saml2ScopedToken"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"[build_sphinx]"},{"line_number":43,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":13,"id":"baada198_b93e09d9","line":40,"updated":"2014-07-16 08:40:51.000000000","message":"do you want this (both of these) to be accessible via CLI and config file?","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6a68833a22e6611ea844702a4b05d997d2c8b495","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    v3password \u003d keystoneclient.auth.identity.v3:Password"},{"line_number":38,"context_line":"    v3token \u003d keystoneclient.auth.identity.v3:Token"},{"line_number":39,"context_line":"    v3unscopedsaml \u003d keystoneclient.contrib.auth.v3.saml2:Saml2UnscopedToken"},{"line_number":40,"context_line":"    v3scopedsaml \u003d keystoneclient.contrib.auth.v3.saml2:Saml2ScopedToken"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"[build_sphinx]"},{"line_number":43,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":13,"id":"baada198_f906c120","line":40,"updated":"2014-07-16 04:44:00.000000000","message":"this doesn\u0027t seem to be needed","commit_id":"05b022c20abdcaa85092abc9304c708a60c6063d"}]}
