)]}'
{"openstack_auth/backend.py":[{"author":{"_account_id":5623,"name":"David Lyle","email":"dklyle0@gmail.com","username":"david-lyle"},"change_message_id":"bf819bfafaa9275022e649dc1863bb40cfbd8759","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                    password\u003dpassword)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class KerberosPlugin(KeystonePlugin):"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def get_plugin(self, request\u003dNone, auth_url\u003dNone, **kwargs):"},{"line_number":70,"context_line":"        if not v3_kerb_auth:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_8e80c247","line":67,"updated":"2015-02-23 18:24:20.000000000","message":"I would prefer that all the auth plugins weren\u0027t defined in this file. This is a strange place to implement what could be several plugins.","commit_id":"04ba31dd5c9bea953c8e15098f2fedec885a26d7"},{"author":{"_account_id":5623,"name":"David Lyle","email":"dklyle0@gmail.com","username":"david-lyle"},"change_message_id":"bf819bfafaa9275022e649dc1863bb40cfbd8759","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"# TODO(jamielennox): this needs to be a more extensible method configured via"},{"line_number":95,"context_line":"# the settings file."},{"line_number":96,"context_line":"AUTH_PLUGINS \u003d [KerberosPlugin(), PasswordPlugin()]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class KeystoneBackend(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_8ece02b3","line":96,"updated":"2015-02-23 18:24:20.000000000","message":"This should be settings driven. Let the deployer pick what plugins they want to support and the fallback order.","commit_id":"04ba31dd5c9bea953c8e15098f2fedec885a26d7"},{"author":{"_account_id":5623,"name":"David Lyle","email":"dklyle0@gmail.com","username":"david-lyle"},"change_message_id":"bf819bfafaa9275022e649dc1863bb40cfbd8759","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            # Support client caching to save on auth calls."},{"line_number":249,"context_line":"            setattr(request, KEYSTONE_CLIENT_ATTR, scoped_client)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        LOG.debug(\u0027Authentication completed.\u0027)"},{"line_number":252,"context_line":"        return user"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def get_group_permissions(self, user, obj\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_ee03feb5","line":251,"updated":"2015-02-23 18:24:20.000000000","message":"let\u0027s leave the username where applicable","commit_id":"04ba31dd5c9bea953c8e15098f2fedec885a26d7"},{"author":{"_account_id":9981,"name":"Doug Fish","email":"drfish@us.ibm.com","username":"doug-fish"},"change_message_id":"fb4b4c17c6501e8f41bc8f1115ccb334cd9f0ab9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            unscoped_auth \u003d plugin.get_plugin(auth_url\u003dauth_url, **kwargs)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            if unscoped_auth:"},{"line_number":95,"context_line":"                break"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            return None"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_4f7985fb","line":95,"updated":"2015-03-11 16:30:04.000000000","message":"Don\u0027t you need the unscoped_auth.get_access call inside the loop to find out if a configured plugin can actually find valid credentials?","commit_id":"b33dc1d73d9c68d45ca3f4c5712052194bd093fa"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"cf873a58dfd9b995db7840281d20b684b2cf5d57","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            unscoped_auth \u003d plugin.get_plugin(auth_url\u003dauth_url, **kwargs)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            if unscoped_auth:"},{"line_number":95,"context_line":"                break"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            return None"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_bb830da8","line":95,"in_reply_to":"9a80dd14_4f7985fb","updated":"2015-03-18 00:35:18.000000000","message":"It really depends how you want it to work, this way is implying that if you\u0027ve got all the parameters you need then only one plugin gets a go. \n\nWe could easily make it so that if a plugin does get all the credentials it needs but auth fails then it attempts the next one - i don\u0027t know which is a better solution here. I don\u0027t think i like the idea of horizon being configured in a way that failing to login with a method is acceptable.","commit_id":"b33dc1d73d9c68d45ca3f4c5712052194bd093fa"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"e7f047103a029fc5d1bc45c574c43dfe3dff09ff","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            if unscoped_auth:"},{"line_number":95,"context_line":"                break"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            return None"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        session \u003d utils.get_session()"},{"line_number":100,"context_line":"        keystone_client_class \u003d utils.get_keystone_client().Client"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_7e55f14e","line":97,"updated":"2015-03-24 19:43:16.000000000","message":"Returning None might just cause some other unexpected processing by Django. I think we should just raise an exception if there are no plugin found.","commit_id":"e6c25ad380dc1feb0ed121d088151d9fde8cacef"},{"author":{"_account_id":5623,"name":"David Lyle","email":"dklyle0@gmail.com","username":"david-lyle"},"change_message_id":"10843b21c945667686ec736ff66f55060f2c5651","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            if unscoped_auth:"},{"line_number":95,"context_line":"                break"},{"line_number":96,"context_line":"        else:"},{"line_number":97,"context_line":"            return None"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        session \u003d utils.get_session()"},{"line_number":100,"context_line":"        keystone_client_class \u003d utils.get_keystone_client().Client"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_58276812","line":97,"in_reply_to":"1a6ced46_7e55f14e","updated":"2015-03-24 21:11:07.000000000","message":"I agree, an exception will be handled better.","commit_id":"e6c25ad380dc1feb0ed121d088151d9fde8cacef"},{"author":{"_account_id":5623,"name":"David Lyle","email":"dklyle0@gmail.com","username":"david-lyle"},"change_message_id":"10843b21c945667686ec736ff66f55060f2c5651","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        except (keystone_exceptions.Unauthorized,"},{"line_number":105,"context_line":"                keystone_exceptions.Forbidden,"},{"line_number":106,"context_line":"                keystone_exceptions.NotFound) as exc:"},{"line_number":107,"context_line":"            msg \u003d _(\u0027Invalid user name or password.\u0027)"},{"line_number":108,"context_line":"            LOG.debug(str(exc))"},{"line_number":109,"context_line":"            raise exceptions.KeystoneAuthException(msg)"},{"line_number":110,"context_line":"        except (keystone_exceptions.ClientException,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6ced46_b8c05c2b","line":107,"updated":"2015-03-24 21:11:07.000000000","message":"This exact text may not apply.","commit_id":"e6c25ad380dc1feb0ed121d088151d9fde8cacef"}],"openstack_auth/views.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"1f12c18ecea2747856f7ed06ac0926e291b0932b","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    # NOTE(jamielennox): First we offer a backend the chance to do"},{"line_number":107,"context_line":"    # authentication based purely on what is available on the request. For"},{"line_number":108,"context_line":"    # example using REMOTE_USER, kerberos or token."},{"line_number":109,"context_line":"    user \u003d auth.authenticate(request\u003drequest)"},{"line_number":110,"context_line":"    if user:"},{"line_number":111,"context_line":"        auth.login(request, user)"},{"line_number":112,"context_line":"        res \u003d shortcuts.redirect(settings.LOGIN_REDIRECT_URL)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6ced46_914ba958","line":109,"updated":"2015-03-24 00:32:12.000000000","message":"In the websso patch, the authentication type is based on the value auth_type the user submitted on the form\n\nhttps://review.openstack.org/#/c/136178/20/openstack_auth/views.py\n\nIn here: we are cycling through all the plugin and let it figure which plugin to use.  \n\nIn terms of implementation for websso, they have to develop a websso plugin that checks for auth_type value in the request and return that plugin if that condition is satisfied correct? \n\nTrying to figure out how the websso patch can be integrated here.","commit_id":"0f50535fe73cdd4254701e9cb8896062c900a190"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"1f12c18ecea2747856f7ed06ac0926e291b0932b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    user \u003d auth.authenticate(request\u003drequest)"},{"line_number":110,"context_line":"    if user:"},{"line_number":111,"context_line":"        auth.login(request, user)"},{"line_number":112,"context_line":"        res \u003d shortcuts.redirect(settings.LOGIN_REDIRECT_URL)"},{"line_number":113,"context_line":"    else:"},{"line_number":114,"context_line":"        res \u003d _default_login(request, **kwargs)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6ced46_568927c9","line":112,"updated":"2015-03-24 00:32:12.000000000","message":"this also needs to handle the case when there is a REDIRECT argument passed in the request, and redirect to that page instead of the LOGIN_REDIRECT_URL.\n\nThis is for the case when the user is in an dashboard page, the session timeouts, it will redirect the user to the login page with   /auth/login?next\u003d\u003cpage the user where\u003e\n\nAnd the user logins, it will redirect the user back where they left off.\n\nYou can look at the logic used in:\n\nhttps://github.com/django/django/blob/master/django/contrib/auth/views.py#L39-L53","commit_id":"0f50535fe73cdd4254701e9cb8896062c900a190"}]}
