)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":13,"context_line":"the plugin will pass forward exceptions and error messages raised by"},{"line_number":14,"context_line":"corresponding plugins."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I1309e08e58b3958209dd248a3905e9f6f91da728"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"fa98f980_c9a9dcde","line":16,"updated":"2014-09-10 05:42:55.000000000","message":"probably need to add:\nImplements: blueprint add-saml2-cli-authentication","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":13,"context_line":"the plugin will pass forward exceptions and error messages raised by"},{"line_number":14,"context_line":"corresponding plugins."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I1309e08e58b3958209dd248a3905e9f6f91da728"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"baa201ad_cb9e7f56","line":16,"in_reply_to":"fa98f980_c9a9dcde","updated":"2014-09-29 16:30:14.000000000","message":"Done","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"}],"keystoneclient/contrib/auth/v3/saml2.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"672b89a563a87c2256e2d4acd78aedfa797c18d0","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        \"\"\""},{"line_number":550,"context_line":"        token, _token_json \u003d self.unscoped_token_auth._get_unscoped_token("},{"line_number":551,"context_line":"            session)"},{"line_number":552,"context_line":"        scoped_auth \u003d self.SCOPED_PLUGIN(self.auth_url, token,"},{"line_number":553,"context_line":"                                         project_id\u003dself.project_id,"},{"line_number":554,"context_line":"                                         domain_id\u003dself.domain_id)"},{"line_number":555,"context_line":"        return scoped_auth.get_auth_ref(session)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_b0df5065","line":552,"updated":"2014-07-22 19:39:25.000000000","message":"@Jamie Lennox: \n\nCan you point out how to neatly use code from: https://review.openstack.org/#/c/107393/ to list projects/domains in case none of them was specified?","commit_id":"25f72b4fa83eeaf87ee8ffee6adbb543e6375a87"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"32d00af624ffc1864c22faba2ac110180ab46932","unresolved":false,"context_lines":[{"line_number":455,"context_line":"    SCOPED_PLUGIN \u003d Saml2ScopedToken"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def __init__(self, auth_url,"},{"line_number":458,"context_line":"                 ecp_implementation,"},{"line_number":459,"context_line":"                 identity_provider, identity_provider_url,"},{"line_number":460,"context_line":"                 username, password,"},{"line_number":461,"context_line":"                 project_id\u003dNone, domain_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_27564f2c","line":458,"updated":"2014-08-05 20:35:05.000000000","message":"there\u0027s no get_option for this","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":455,"context_line":"    SCOPED_PLUGIN \u003d Saml2ScopedToken"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def __init__(self, auth_url,"},{"line_number":458,"context_line":"                 ecp_implementation,"},{"line_number":459,"context_line":"                 identity_provider, identity_provider_url,"},{"line_number":460,"context_line":"                 username, password,"},{"line_number":461,"context_line":"                 project_id\u003dNone, domain_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_24c7ed13","line":458,"in_reply_to":"baada198_0a6312df","updated":"2014-09-10 05:42:55.000000000","message":"i feel like this one should be moved to after domain_id, and defaulted to \u0027shib\u0027 or None (then defaulted to shib).","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"48f0ddf2ce7c8dbc451e15199b9f0ca793d6926c","unresolved":false,"context_lines":[{"line_number":455,"context_line":"    SCOPED_PLUGIN \u003d Saml2ScopedToken"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def __init__(self, auth_url,"},{"line_number":458,"context_line":"                 ecp_implementation,"},{"line_number":459,"context_line":"                 identity_provider, identity_provider_url,"},{"line_number":460,"context_line":"                 username, password,"},{"line_number":461,"context_line":"                 project_id\u003dNone, domain_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_0a6312df","line":458,"in_reply_to":"baada198_27564f2c","updated":"2014-08-05 20:39:46.000000000","message":"yeah, that should be renamed to unscoped_token_auth. Depending on the IdP user may need to utilize standard Shiboleth ECP workflow or e.g ADFS.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":455,"context_line":"    SCOPED_PLUGIN \u003d Saml2ScopedToken"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def __init__(self, auth_url,"},{"line_number":458,"context_line":"                 ecp_implementation,"},{"line_number":459,"context_line":"                 identity_provider, identity_provider_url,"},{"line_number":460,"context_line":"                 username, password,"},{"line_number":461,"context_line":"                 project_id\u003dNone, domain_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_ff194b7a","line":458,"in_reply_to":"fa98f980_24c7ed13","updated":"2014-09-29 16:30:14.000000000","message":"Done","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        Save required parameters, do initial validation of input parameters"},{"line_number":466,"context_line":"        and invoke underlying object for getting unscoped token."},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        :param ecp_implementation: What implementation for getting unscoped"},{"line_number":469,"context_line":"            token a user wants to use."},{"line_number":470,"context_line":"        :type ecp_implementation: string"},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_e4e405ae","line":468,"updated":"2014-09-10 05:42:55.000000000","message":"update the comments too","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        Save required parameters, do initial validation of input parameters"},{"line_number":466,"context_line":"        and invoke underlying object for getting unscoped token."},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        :param ecp_implementation: What implementation for getting unscoped"},{"line_number":469,"context_line":"            token a user wants to use."},{"line_number":470,"context_line":"        :type ecp_implementation: string"},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_a40b3a2a","line":468,"in_reply_to":"fa98f980_e4e405ae","updated":"2014-09-29 16:30:14.000000000","message":"Done","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        :param password: User\u0027s password"},{"line_number":485,"context_line":"        :type password: string"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :raises exceptions.ScopingTokenError: in case both project_id and"},{"line_number":488,"context_line":"            domain_id are set."},{"line_number":489,"context_line":"        :raises exceptions.ValidationError: raise if ``ecp_implementation``"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_44f15169","line":486,"updated":"2014-09-10 05:42:55.000000000","message":"list domain and project here too","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        :param password: User\u0027s password"},{"line_number":485,"context_line":"        :type password: string"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :raises exceptions.ScopingTokenError: in case both project_id and"},{"line_number":488,"context_line":"            domain_id are set."},{"line_number":489,"context_line":"        :raises exceptions.ValidationError: raise if ``ecp_implementation``"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_1f260fbb","line":486,"in_reply_to":"fa98f980_44f15169","updated":"2014-09-29 16:30:14.000000000","message":"Done","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :raises exceptions.ScopingTokenError: in case both project_id and"},{"line_number":488,"context_line":"            domain_id are set."},{"line_number":489,"context_line":"        :raises exceptions.ValidationError: raise if ``ecp_implementation``"},{"line_number":490,"context_line":"            is not defined."},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_64e8157d","line":489,"updated":"2014-09-10 05:42:55.000000000","message":"update this too","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :raises exceptions.ScopingTokenError: in case both project_id and"},{"line_number":488,"context_line":"            domain_id are set."},{"line_number":489,"context_line":"        :raises exceptions.ValidationError: raise if ``ecp_implementation``"},{"line_number":490,"context_line":"            is not defined."},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_3f2bd383","line":489,"in_reply_to":"fa98f980_64e8157d","updated":"2014-09-29 16:30:14.000000000","message":"Done","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"32d00af624ffc1864c22faba2ac110180ab46932","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        unscoped_auth_cls \u003d self._load_unscoped_plugin(ecp_implementation)"},{"line_number":498,"context_line":"        self.unscoped_token_auth \u003d unscoped_auth_cls("},{"line_number":499,"context_line":"            auth_url, identity_provider, identity_provider_url,"},{"line_number":500,"context_line":"            username, password, **kwargs)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def _load_unscoped_plugin(self, impl):"},{"line_number":503,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_27048f18","line":500,"updated":"2014-08-05 20:35:05.000000000","message":"passing kwargs twice seems odd...","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        unscoped_auth_cls \u003d self._load_unscoped_plugin(ecp_implementation)"},{"line_number":498,"context_line":"        self.unscoped_token_auth \u003d unscoped_auth_cls("},{"line_number":499,"context_line":"            auth_url, identity_provider, identity_provider_url,"},{"line_number":500,"context_line":"            username, password, **kwargs)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def _load_unscoped_plugin(self, impl):"},{"line_number":503,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_bf36e3e5","line":500,"in_reply_to":"baada198_27048f18","updated":"2014-09-29 16:30:14.000000000","message":"i want to be able to pass kwargs to unscoped_auth_cls as plugins options may differ. And I already have a requirement for that. ADFS plugin needs one more parameter, that ECP implementation doesn\u0027t require.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"b9ad33315076bb9f67ef0dc03784d2a5d2e80df1","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    @classmethod"},{"line_number":510,"context_line":"    def _get_unscoped_plugins_options(cls):"},{"line_number":511,"context_line":"        \"\"\"Expose options of underlying auth plugins.\"\"\""},{"line_number":512,"context_line":"        for plugin in cls.UNSCOPED_PLUGINS.values():"},{"line_number":513,"context_line":"            yield plugin.get_options()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_ffb8c612","line":510,"updated":"2014-08-21 13:16:19.000000000","message":"for clarity in conf files and to avoid unwanted effects, there should be a filtering of options since it\u0027s likely that the unscoped plugins will share some similarly named ones. The current way will list them each time they appear","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    @classmethod"},{"line_number":510,"context_line":"    def _get_unscoped_plugins_options(cls):"},{"line_number":511,"context_line":"        \"\"\"Expose options of underlying auth plugins.\"\"\""},{"line_number":512,"context_line":"        for plugin in cls.UNSCOPED_PLUGINS.values():"},{"line_number":513,"context_line":"            yield plugin.get_options()"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_5f6ed7ca","line":510,"in_reply_to":"1abeadc6_ffb8c612","updated":"2014-09-29 16:30:14.000000000","message":"yeah, you are right.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"32d00af624ffc1864c22faba2ac110180ab46932","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            cfg.StrOpt(\u0027unscoped-token-auth\u0027,"},{"line_number":524,"context_line":"                       help\u003d(\u0027Which plugin to use for retrieving an unscoped\u0027"},{"line_number":525,"context_line":"                             \u0027token (implementation depends on your IdP)\u0027))"},{"line_number":526,"context_line":"        ])"},{"line_number":527,"context_line":"        options.extend(self._get_unscoped_plugins_options())"},{"line_number":528,"context_line":"        options.extend(self._get_scoped_plugins_options())"},{"line_number":529,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_67bcc7b6","line":526,"updated":"2014-08-05 20:35:05.000000000","message":"how does this work when you pass a string argument called unscoped_token_auth to __init__?","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"48f0ddf2ce7c8dbc451e15199b9f0ca793d6926c","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            cfg.StrOpt(\u0027unscoped-token-auth\u0027,"},{"line_number":524,"context_line":"                       help\u003d(\u0027Which plugin to use for retrieving an unscoped\u0027"},{"line_number":525,"context_line":"                             \u0027token (implementation depends on your IdP)\u0027))"},{"line_number":526,"context_line":"        ])"},{"line_number":527,"context_line":"        options.extend(self._get_unscoped_plugins_options())"},{"line_number":528,"context_line":"        options.extend(self._get_scoped_plugins_options())"},{"line_number":529,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_eaa5fe03","line":526,"in_reply_to":"baada198_67bcc7b6","updated":"2014-08-05 20:39:46.000000000","message":"--unscoped-token-auth \u003d {shib, adfs} and depending on that value a different plugin for getting unscoped token will be used.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"64c0a8c58373e5656c6939b96b06d7c33872e86f","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                       help\u003d(\u0027Which plugin to use for retrieving an unscoped\u0027"},{"line_number":525,"context_line":"                             \u0027token (implementation depends on your IdP)\u0027))"},{"line_number":526,"context_line":"        ])"},{"line_number":527,"context_line":"        options.extend(self._get_unscoped_plugins_options())"},{"line_number":528,"context_line":"        options.extend(self._get_scoped_plugins_options())"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        return options"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_6ab1ee43","line":527,"updated":"2014-08-05 20:41:16.000000000","message":"i dont think this will work. get_unscoped is a generator","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fc6e63931a3191108fd86361d97fd7fa501d28ba","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                       help\u003d(\u0027Which plugin to use for retrieving an unscoped\u0027"},{"line_number":525,"context_line":"                             \u0027token (implementation depends on your IdP)\u0027))"},{"line_number":526,"context_line":"        ])"},{"line_number":527,"context_line":"        options.extend(self._get_unscoped_plugins_options())"},{"line_number":528,"context_line":"        options.extend(self._get_scoped_plugins_options())"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        return options"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_4a67cab8","line":527,"in_reply_to":"baada198_6ab1ee43","updated":"2014-08-05 20:45:53.000000000","message":"I just made a test (Python2 and Python3):\n\ndef gen():\n    for x in range(10):\n        yield x\n\na \u003d []\na.extend(gen())\n\nprint a\n\nresult: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"73ce40e57f2d586b917b235d6d20dacc374b1ffa","unresolved":false,"context_lines":[{"line_number":987,"context_line":"            msg \u003d \"Invalid options: %(invalid_opts)s\""},{"line_number":988,"context_line":"            msg \u003d msg % {\u0027invalid_opts\u0027: \",\".join(disallowed_keys)}"},{"line_number":989,"context_line":"            if disallowed_keys:"},{"line_number":990,"context_line":"                raise exceptions.ValidationError(msg)"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"        super(Saml2Wrapper, self).__init__(auth_url\u003dauth_url,"},{"line_number":993,"context_line":"                                           project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_7d745cfd","line":990,"updated":"2014-09-30 14:45:02.000000000","message":"I think it should be an AttributeError, to be consistent with keystoneclient.auth.identity.v3:AuthMethod \u0027s __init__ check","commit_id":"96c942257471c81b602d407bf4a0c73191313762"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"73ce40e57f2d586b917b235d6d20dacc374b1ffa","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"                yield option"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    @classmethod"},{"line_number":1021,"context_line":"    def get_options(cls):"},{"line_number":1022,"context_line":""},{"line_number":1023,"context_line":"        def extend(options, option_candidates):"},{"line_number":1024,"context_line":"            for opt in option_candidates:"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_9d2ca04c","line":1021,"updated":"2014-09-30 14:45:02.000000000","message":"this inherits \u0027project_name\u0027 and \u0027domain_name\u0027 as options from keystoneclient.auth.identity.v3:Auth - if token scoping only works with ids you might want to take these out to avoid confusion","commit_id":"96c942257471c81b602d407bf4a0c73191313762"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"56d32d36f31a85f3ecf7fa283d4923d82eda8f29","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        :type password: string"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        \"\"\""},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        super(ADFSUnscopedToken, self).__init__(auth_url\u003dauth_url, **kwargs)"},{"line_number":493,"context_line":"        self.identity_provider \u003d identity_provider"},{"line_number":494,"context_line":"        self.identity_provider_url \u003d identity_provider_url"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_d25ede11","side":"PARENT","line":491,"updated":"2014-10-22 12:54:45.000000000","message":"nit: whitespace change","commit_id":"89dc951f7d5a603f0c34b7c2cb9f7d26d73d9916"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        :type password: string"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        \"\"\""},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        super(ADFSUnscopedToken, self).__init__(auth_url\u003dauth_url, **kwargs)"},{"line_number":493,"context_line":"        self.identity_provider \u003d identity_provider"},{"line_number":494,"context_line":"        self.identity_provider_url \u003d identity_provider_url"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_62c6286a","side":"PARENT","line":491,"in_reply_to":"9aa7fdbe_d25ede11","updated":"2014-10-23 12:17:27.000000000","message":"reverted","commit_id":"89dc951f7d5a603f0c34b7c2cb9f7d26d73d9916"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"ea9acc16a1ae58288d1efd2682650ee1d0288416","unresolved":false,"context_lines":[{"line_number":898,"context_line":"    \"\"\""},{"line_number":899,"context_line":"    _auth_method_class \u003d Saml2UnscopedTokenAuthMethod"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"    UNSCOPED_PLUGINS \u003d {"},{"line_number":902,"context_line":"        \u0027shib\u0027: Saml2UnscopedToken,"},{"line_number":903,"context_line":"        \u0027adfs\u0027: ADFSUnscopedToken"},{"line_number":904,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"baa201ad_4541d3a7","line":901,"updated":"2014-10-17 15:38:40.000000000","message":"If new unscoped token plugin will be added this will also require a change in the Saml2Wrapper code. Can we make it sligthly more dynamic?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":898,"context_line":"    \"\"\""},{"line_number":899,"context_line":"    _auth_method_class \u003d Saml2UnscopedTokenAuthMethod"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"    UNSCOPED_PLUGINS \u003d {"},{"line_number":902,"context_line":"        \u0027shib\u0027: Saml2UnscopedToken,"},{"line_number":903,"context_line":"        \u0027adfs\u0027: ADFSUnscopedToken"},{"line_number":904,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_ffcd4fb8","line":901,"in_reply_to":"9aa7fdbe_173138a2","updated":"2014-10-23 12:17:27.000000000","message":"ok, leaving as-is for now.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"56d32d36f31a85f3ecf7fa283d4923d82eda8f29","unresolved":false,"context_lines":[{"line_number":898,"context_line":"    \"\"\""},{"line_number":899,"context_line":"    _auth_method_class \u003d Saml2UnscopedTokenAuthMethod"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"    UNSCOPED_PLUGINS \u003d {"},{"line_number":902,"context_line":"        \u0027shib\u0027: Saml2UnscopedToken,"},{"line_number":903,"context_line":"        \u0027adfs\u0027: ADFSUnscopedToken"},{"line_number":904,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_173138a2","line":901,"in_reply_to":"9aa7fdbe_8527bf63","updated":"2014-10-22 12:54:45.000000000","message":"it\u0027s also a fairly easy thing to extend via stevedore if you ever get the need in the same way the actual auth plugins are defined. \n\nI wouldn\u0027t worry about it for now but might be useful later.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7af28fb908786d162ca8003efd382ec23ce8a572","unresolved":false,"context_lines":[{"line_number":898,"context_line":"    \"\"\""},{"line_number":899,"context_line":"    _auth_method_class \u003d Saml2UnscopedTokenAuthMethod"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"    UNSCOPED_PLUGINS \u003d {"},{"line_number":902,"context_line":"        \u0027shib\u0027: Saml2UnscopedToken,"},{"line_number":903,"context_line":"        \u0027adfs\u0027: ADFSUnscopedToken"},{"line_number":904,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_8527bf63","line":901,"in_reply_to":"baa201ad_4541d3a7","updated":"2014-10-22 07:10:49.000000000","message":"i think this is fine, i can\u0027t imagine we would have to do that more than once or twice.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e2293cd32c4a89ea21a167ad42b4e3791b01ed7","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            token a user wants to use. Default to ``shib``"},{"line_number":935,"context_line":"        :type unscoped_token_plugin: string"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"        Parameters currently expected to be stored inside kwargs::"},{"line_number":938,"context_line":"        :param username: User\u0027s login"},{"line_number":939,"context_line":"        :type username: string"},{"line_number":940,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_7d734380","line":937,"updated":"2014-10-22 14:06:09.000000000","message":"If these are expected in kwargs why not just add them as named params so that they are part of the signature?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            token a user wants to use. Default to ``shib``"},{"line_number":935,"context_line":"        :type unscoped_token_plugin: string"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"        Parameters currently expected to be stored inside kwargs::"},{"line_number":938,"context_line":"        :param username: User\u0027s login"},{"line_number":939,"context_line":"        :type username: string"},{"line_number":940,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_df97ab38","line":937,"in_reply_to":"9aa7fdbe_7d734380","updated":"2014-10-23 12:17:27.000000000","message":"I think i need this plugin, and its __init__ signature as generic as possible. See, currently the two unscoped-token-plugins require username and password in their signature, but one day I may want to add a mechanism to those plugins that will login with the IdP not with user/pass credentials but with...say a certificate. Then, you will need an option cert instead of username, password. I prefer to have a freedom and simply be able to call the wrapper Saml2Wrapper(cert\u003d\u0027path\u0027) rather then Saml2Wrapper(username\u003dNone, password\u003dNone, cert\u003d\u0027path\u0027). Plus, every change to a underlying plugin would require a change to a Wrapper class. I also don\u0027t want to aggregate all possible arguments in the Saml2Wrapper.__init__() method.\nI once got into backwards compatibility issues just because I put arguments in the function signature.\nAs I really don\u0027t like kwargs I think this wrapper is a cover for other plugins and we shouldn\u0027t resolve too much at wrappers leve. Let is simply take dumb pack of arguments, use one (like the implementation) and pass the rest to the underlying classes and let them complain if somethigs wrong with the parameters.\nHowever, if you have any better ideas than using kwargs I\u0027d be more than happy to learn something new.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e2293cd32c4a89ea21a167ad42b4e3791b01ed7","unresolved":false,"context_lines":[{"line_number":967,"context_line":"            for disallowed_key in disallowed_keys:"},{"line_number":968,"context_line":"                del kwargs[disallowed_key]"},{"line_number":969,"context_line":""},{"line_number":970,"context_line":"        def check_options(available_options, kwargs):"},{"line_number":971,"context_line":"            \"\"\"Check if passed arguments are all marked as allowed."},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"            Compare passed kwargs arguments with those listed from"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_5d175f51","line":970,"updated":"2014-10-22 14:06:09.000000000","message":"I think here are only a few things missing in the method definition. If you add them would you need this anymore?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e2293cd32c4a89ea21a167ad42b4e3791b01ed7","unresolved":false,"context_lines":[{"line_number":999,"context_line":"        available_options \u003d self.get_options()"},{"line_number":1000,"context_line":"        plugin_options \u003d unscoped_auth_cls.get_options()"},{"line_number":1001,"context_line":"        check_options(available_options, kwargs)"},{"line_number":1002,"context_line":"        filter_options(plugin_options, kwargs)"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"        kwargs[\u0027auth_url\u0027] \u003d auth_url"},{"line_number":1005,"context_line":"        kwargs[\u0027identity_provider\u0027] \u003d identity_provider"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_38a1c947","line":1002,"updated":"2014-10-22 14:06:09.000000000","message":"These two lines feel weird, but that maybe because I\u0027m use to the crazy kwargs usage in ksc. You first make sure that the only kwargs you can get are ones for *any* possible plugin. Then you filter out the ones you got (that are possible) to only the ones that are allowed.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":999,"context_line":"        available_options \u003d self.get_options()"},{"line_number":1000,"context_line":"        plugin_options \u003d unscoped_auth_cls.get_options()"},{"line_number":1001,"context_line":"        check_options(available_options, kwargs)"},{"line_number":1002,"context_line":"        filter_options(plugin_options, kwargs)"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"        kwargs[\u0027auth_url\u0027] \u003d auth_url"},{"line_number":1005,"context_line":"        kwargs[\u0027identity_provider\u0027] \u003d identity_provider"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_a539faa5","line":1002,"in_reply_to":"9aa7fdbe_38a1c947","updated":"2014-10-23 12:17:27.000000000","message":"Well. This wrapper must expose a superset of all options from the underlying plugins.\nLet\u0027s say there are two plugins registered: A and B. A has options Aa, Ab, and Ba, Bb. Saml2Wrapper.get_options() will result (among any other options) [Aa, Ab, Ba, Bb]\nIt looks like I was trying to make sure that since i know what unscoped-token-plugin is going to be used I will fetch options from that plugin only and remove all other. \nWhich actually now makes me think that it could be resolved at the underlying plugin level.....","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"56d32d36f31a85f3ecf7fa283d4923d82eda8f29","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"        kwargs[\u0027identity_provider\u0027] \u003d identity_provider"},{"line_number":1006,"context_line":"        kwargs[\u0027identity_provider_url\u0027] \u003d identity_provider_url"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"        self.unscoped_token_auth \u003d unscoped_auth_cls(**kwargs)"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"    def _load_unscoped_plugin(self, impl):"},{"line_number":1011,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_7269b2bd","line":1008,"updated":"2014-10-22 12:54:45.000000000","message":"i\u0027m not sure i follow this, why wouldn\u0027t we use unscoped_auth_cls.load_from_options? wouldn\u0027t they all be options at this point?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"        kwargs[\u0027identity_provider\u0027] \u003d identity_provider"},{"line_number":1006,"context_line":"        kwargs[\u0027identity_provider_url\u0027] \u003d identity_provider_url"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"        self.unscoped_token_auth \u003d unscoped_auth_cls(**kwargs)"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"    def _load_unscoped_plugin(self, impl):"},{"line_number":1011,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_256a6ab3","line":1008,"in_reply_to":"9aa7fdbe_7269b2bd","updated":"2014-10-23 12:17:27.000000000","message":"it\u0027d simply make the line longer with exactly the same effect.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"56d32d36f31a85f3ecf7fa283d4923d82eda8f29","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        \"\"\"Expose options of underlying auth plugins.\"\"\""},{"line_number":1020,"context_line":"        for plugin in cls.UNSCOPED_PLUGINS.values():"},{"line_number":1021,"context_line":"            for option in plugin.get_options():"},{"line_number":1022,"context_line":"                yield option"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    @classmethod"},{"line_number":1025,"context_line":"    def get_options(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_525cae25","line":1022,"updated":"2014-10-22 12:54:45.000000000","message":"look at itertools.chain","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        \"\"\"Expose options of underlying auth plugins.\"\"\""},{"line_number":1020,"context_line":"        for plugin in cls.UNSCOPED_PLUGINS.values():"},{"line_number":1021,"context_line":"            for option in plugin.get_options():"},{"line_number":1022,"context_line":"                yield option"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    @classmethod"},{"line_number":1025,"context_line":"    def get_options(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_c86533b6","line":1022,"in_reply_to":"9aa7fdbe_525cae25","updated":"2014-10-23 12:17:27.000000000","message":"useful, thanks. Does something like:\n    def _get_unscoped_plugins_options(cls):\n        \"\"\"Expose options of underlying auth plugins.\"\"\"\n        options \u003d [plugin.get_options() for plugin in cls.UNSCOPED_PLUGINS.values()]\n        return itertools.chain(*options)\n\nwork for you?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"56d32d36f31a85f3ecf7fa283d4923d82eda8f29","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        def extend(options, option_candidates):"},{"line_number":1028,"context_line":"            for opt in option_candidates:"},{"line_number":1029,"context_line":"                if opt.name not in options.keys():"},{"line_number":1030,"context_line":"                    options[opt.name] \u003d opt"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        options \u003d dict((opt.name, opt) for opt in"},{"line_number":1033,"context_line":"                       super(Saml2Wrapper, cls).get_options())"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_f7191489","line":1030,"updated":"2014-10-22 12:54:45.000000000","message":"this is the same as options.setdefault(opt.name, opt)","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        def extend(options, option_candidates):"},{"line_number":1028,"context_line":"            for opt in option_candidates:"},{"line_number":1029,"context_line":"                if opt.name not in options.keys():"},{"line_number":1030,"context_line":"                    options[opt.name] \u003d opt"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        options \u003d dict((opt.name, opt) for opt in"},{"line_number":1033,"context_line":"                       super(Saml2Wrapper, cls).get_options())"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_0280fc44","line":1030,"in_reply_to":"9aa7fdbe_ddd7cfeb","updated":"2014-10-23 12:17:27.000000000","message":"Done","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e2293cd32c4a89ea21a167ad42b4e3791b01ed7","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        def extend(options, option_candidates):"},{"line_number":1028,"context_line":"            for opt in option_candidates:"},{"line_number":1029,"context_line":"                if opt.name not in options.keys():"},{"line_number":1030,"context_line":"                    options[opt.name] \u003d opt"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        options \u003d dict((opt.name, opt) for opt in"},{"line_number":1033,"context_line":"                       super(Saml2Wrapper, cls).get_options())"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_ddd7cfeb","line":1030,"in_reply_to":"9aa7fdbe_f7191489","updated":"2014-10-22 14:06:09.000000000","message":"I think it is also more efficient because you would not be getting a list of keys and doing a contains check for every iteration of the loop. (besides setdefault doing \u0027opt.name not in options\u0027 would be much more efficient because it\u0027s a hash table lookup)","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"56d32d36f31a85f3ecf7fa283d4923d82eda8f29","unresolved":false,"context_lines":[{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            return self._unscoped_token"},{"line_number":1057,"context_line":"        except AttributeError:"},{"line_number":1058,"context_line":"            return None"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def get_auth_ref(self, session, **kwargs):"},{"line_number":1061,"context_line":"        \"\"\"Effectively obtain scoped token upon federated authentication"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_b71b0c1a","line":1058,"updated":"2014-10-22 12:54:45.000000000","message":"normally you\u0027d set self._unscoped_token \u003d None in __init__","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            return self._unscoped_token"},{"line_number":1057,"context_line":"        except AttributeError:"},{"line_number":1058,"context_line":"            return None"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def get_auth_ref(self, session, **kwargs):"},{"line_number":1061,"context_line":"        \"\"\"Effectively obtain scoped token upon federated authentication"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_bfce672c","line":1058,"in_reply_to":"9aa7fdbe_9d22a7ff","updated":"2014-10-23 12:17:27.000000000","message":"++.\nRemoved the property.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e2293cd32c4a89ea21a167ad42b4e3791b01ed7","unresolved":false,"context_lines":[{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            return self._unscoped_token"},{"line_number":1057,"context_line":"        except AttributeError:"},{"line_number":1058,"context_line":"            return None"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def get_auth_ref(self, session, **kwargs):"},{"line_number":1061,"context_line":"        \"\"\"Effectively obtain scoped token upon federated authentication"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_9d22a7ff","line":1058,"in_reply_to":"9aa7fdbe_b71b0c1a","updated":"2014-10-22 14:06:09.000000000","message":"If you used unscoped_token instead of _unscoped_token I dont\u0027 think you would need this to be a property.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e2293cd32c4a89ea21a167ad42b4e3791b01ed7","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"        except AttributeError:"},{"line_number":1058,"context_line":"            return None"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def get_auth_ref(self, session, **kwargs):"},{"line_number":1061,"context_line":"        \"\"\"Effectively obtain scoped token upon federated authentication"},{"line_number":1062,"context_line":""},{"line_number":1063,"context_line":"        Execute already instantiated plugin for obtaining unscoped token."}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_5d3aff36","line":1060,"updated":"2014-10-22 14:06:09.000000000","message":"Do we need kwargs here because this gets called with things we don\u0027t care about?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7aaff83c646718ff6493ea3859aa5877a3d19cfc","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"        except AttributeError:"},{"line_number":1058,"context_line":"            return None"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def get_auth_ref(self, session, **kwargs):"},{"line_number":1061,"context_line":"        \"\"\"Effectively obtain scoped token upon federated authentication"},{"line_number":1062,"context_line":""},{"line_number":1063,"context_line":"        Execute already instantiated plugin for obtaining unscoped token."}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_7f2a3f91","line":1060,"in_reply_to":"9aa7fdbe_5d3aff36","updated":"2014-10-23 12:17:27.000000000","message":"i don\u0027t expect any other arguments here, however i simply followed v3.Auth.get_auth_ref()\u0027s signature. \nI am removing **kwargs then.","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"}],"keystoneclient/tests/v3/test_auth_saml2.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":399,"context_line":"            self.TEST_USER, self.TEST_TOKEN,"},{"line_number":400,"context_line":"            project_id\u003dself.TEST_TENANT_ID)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def test_full_workflow_project(self):"},{"line_number":403,"context_line":"        self.requests.register_uri("},{"line_number":404,"context_line":"            \u0027GET\u0027, self.FEDERATION_AUTH_URL,"},{"line_number":405,"context_line":"            content\u003dself.make_oneline(saml2_fixtures.SP_SOAP_RESPONSE))"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_04a58946","line":402,"updated":"2014-09-10 05:42:55.000000000","message":"this is a damn nice test, +1","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":399,"context_line":"            self.TEST_USER, self.TEST_TOKEN,"},{"line_number":400,"context_line":"            project_id\u003dself.TEST_TENANT_ID)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def test_full_workflow_project(self):"},{"line_number":403,"context_line":"        self.requests.register_uri("},{"line_number":404,"context_line":"            \u0027GET\u0027, self.FEDERATION_AUTH_URL,"},{"line_number":405,"context_line":"            content\u003dself.make_oneline(saml2_fixtures.SP_SOAP_RESPONSE))"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_e5c37c36","line":402,"in_reply_to":"fa98f980_04a58946","updated":"2014-09-29 16:30:14.000000000","message":"thank you!","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        self.assertEqual(self.TEST_TENANT_NAME, token.project_name)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def test_full_workflow_domain(self):"},{"line_number":427,"context_line":"        self.requests.register_uri(\u0027GET\u0027, self.FEDERATION_AUTH_URL,"},{"line_number":428,"context_line":"                                   content\u003dself.make_oneline("},{"line_number":429,"context_line":"                                   saml2_fixtures.SP_SOAP_RESPONSE))"},{"line_number":430,"context_line":"        self.requests.register_uri(\u0027POST\u0027, self.IDENTITY_PROVIDER_URL,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_847099dd","line":427,"updated":"2014-09-10 05:42:55.000000000","message":"i think this is identical to the project test, suggest making a helper method to reduce code duplication.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        self.assertEqual(self.TEST_TENANT_NAME, token.project_name)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def test_full_workflow_domain(self):"},{"line_number":427,"context_line":"        self.requests.register_uri(\u0027GET\u0027, self.FEDERATION_AUTH_URL,"},{"line_number":428,"context_line":"                                   content\u003dself.make_oneline("},{"line_number":429,"context_line":"                                   saml2_fixtures.SP_SOAP_RESPONSE))"},{"line_number":430,"context_line":"        self.requests.register_uri(\u0027POST\u0027, self.IDENTITY_PROVIDER_URL,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_7709ff2b","line":427,"in_reply_to":"fa98f980_847099dd","updated":"2014-09-29 16:30:14.000000000","message":"i moved mutual parts to a private method.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7af28fb908786d162ca8003efd382ec23ce8a572","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    def setUp(self):"},{"line_number":649,"context_line":"        super(Saml2WrapperTests, self).setUp()"},{"line_number":650,"context_line":"        self.session.redirect \u003d False"},{"line_number":651,"context_line":"        self.UNSCOPED_AUTH_PLUGIN_NAME \u003d \u0027shib\u0027"},{"line_number":652,"context_line":"        self.wrapper_plugin \u003d saml2.Saml2Wrapper("},{"line_number":653,"context_line":"            auth_url\u003dself.TEST_URL, identity_provider\u003dself.IDENTITY_PROVIDER,"},{"line_number":654,"context_line":"            identity_provider_url\u003dself.IDENTITY_PROVIDER_URL,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_989d625c","line":651,"updated":"2014-10-22 07:10:49.000000000","message":"what about adfs?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7af28fb908786d162ca8003efd382ec23ce8a572","unresolved":false,"context_lines":[{"line_number":657,"context_line":"            unscoped_token_plugin\u003dself.UNSCOPED_AUTH_PLUGIN_NAME)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    def _test_conf_params(self, implementation):"},{"line_number":660,"context_line":"        section \u003d uuid.uuid4().hex"},{"line_number":661,"context_line":"        identity_provider \u003d uuid.uuid4().hex"},{"line_number":662,"context_line":"        identity_provider_url \u003d uuid.uuid4().hex"},{"line_number":663,"context_line":"        username \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_d81b6a1a","line":660,"updated":"2014-10-22 07:10:49.000000000","message":"i\u0027m not super clear on what `section` is here","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7af28fb908786d162ca8003efd382ec23ce8a572","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        username \u003d uuid.uuid4().hex"},{"line_number":664,"context_line":"        password \u003d uuid.uuid4().hex"},{"line_number":665,"context_line":"        sp_endpoint \u003d uuid.uuid4().hex"},{"line_number":666,"context_line":"        unscoped_token_auth \u003d implementation"},{"line_number":667,"context_line":"        self.conf_fixture.config(auth_section\u003dsection, group\u003dself.GROUP)"},{"line_number":668,"context_line":"        conf.register_conf_options(self.conf_fixture.conf, group\u003dself.GROUP)"},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_b8cea681","line":666,"updated":"2014-10-22 07:10:49.000000000","message":"you could remove this line and just pass in `implementation` to line 678","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7af28fb908786d162ca8003efd382ec23ce8a572","unresolved":false,"context_lines":[{"line_number":678,"context_line":"                                 service_provider_endpoint\u003dsp_endpoint,"},{"line_number":679,"context_line":"                                 group\u003dsection)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"        a \u003d conf.load_from_conf_options(self.conf_fixture.conf, self.GROUP)"},{"line_number":682,"context_line":"        self.assertEqual(identity_provider,"},{"line_number":683,"context_line":"                         a.unscoped_token_auth.identity_provider)"},{"line_number":684,"context_line":"        self.assertEqual(identity_provider_url,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_58d77a23","line":681,"updated":"2014-10-22 07:10:49.000000000","message":"what\u0027s \u0027a\u0027 supposed to be? auth_plugin?","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7af28fb908786d162ca8003efd382ec23ce8a572","unresolved":false,"context_lines":[{"line_number":736,"context_line":"            json\u003dauthenticated_response,"},{"line_number":737,"context_line":"            headers\u003dclient_fixtures.AUTH_RESPONSE_HEADERS)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def test_full_workflow_project(self):"},{"line_number":740,"context_line":"        self._prepare_for_workflow_tests(self.PROJECT_SCOPED_TOKEN_JSON)"},{"line_number":741,"context_line":"        token \u003d self.wrapper_plugin.get_auth_ref(self.session)"},{"line_number":742,"context_line":"        self.assertTrue(token.project_scoped, \"Received token is not scoped\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aa7fdbe_f8766e3d","line":739,"updated":"2014-10-22 07:10:49.000000000","message":"if you are making more changes to the file, add a quick one line doc string to the tests","commit_id":"5d33aabf4e5bb738b84eb9af904a8eb2c509de1e"}],"setup.cfg":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"b9ad33315076bb9f67ef0dc03784d2a5d2e80df1","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":"    saml2 \u003d keystoneclient.contrib.auth.v3.saml:Saml2Wrapper"},{"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":6,"id":"1abeadc6_3f0cfeec","line":40,"updated":"2014-08-21 13:16:19.000000000","message":"Could you name it v3saml2 to mirror the naming convention so far ? In my pending patch for osc, I took it as granted and use it to check against the identity api version passed as an argument.","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b0835359974345e0463a7ff2b666affb687e7389","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":"    saml2 \u003d keystoneclient.contrib.auth.v3.saml:Saml2Wrapper"},{"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":6,"id":"fa98f980_4985ec57","line":40,"in_reply_to":"1abeadc6_3f0cfeec","updated":"2014-09-10 05:42:55.000000000","message":"++","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"289bd0f3c14e703cd19c316b1034b395f48bb7af","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":"    saml2 \u003d keystoneclient.contrib.auth.v3.saml:Saml2Wrapper"},{"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":6,"id":"baa201ad_9abbea71","line":40,"in_reply_to":"fa98f980_4985ec57","updated":"2014-09-29 16:30:14.000000000","message":"Done","commit_id":"4d11ce80fe5089210ec3aebd7a4282efbef5c3d2"}]}
