)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"5f3d5583237f6b5348f087b05989d60416c20eed","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Basic-Auth middleware"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A simple middleware that allows setting nd testing the REMOTE_USER env var"},{"line_number":10,"context_line":"basedon a user lookup.  Users log in with user_id and password."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Blueprint: basic-auth"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9ad9bd40_fb8f1d28","line":9,"updated":"2014-05-06 08:42:20.000000000","message":"Change \"allows setting nd testing\" by \"allows setting and testing\".\nChange \"basedon\" by \"based on\"","commit_id":"38c50310c1ba1ea5646f3c00c4d4299a3e14817d"}],"keystone/middleware/basic_auth.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"690bf55d0082847cb3e1beae10e631cd8c744add","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.common import wsgi"},{"line_number":16,"context_line":"from keystone import exception"},{"line_number":17,"context_line":"from keystone.openstack.common import log"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"CONF \u003d config.CONF"},{"line_number":20,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_21ca4f4f","line":18,"updated":"2014-06-11 01:48:34.000000000","message":"Newline","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":11045,"name":"Bob Thyne","email":"bob.thyne@hp.com","username":"bobt"},"change_message_id":"a0f0abd9dfa57107261468c975bde77180110977","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    scheme, data \u003d auth.split(None, 1)"},{"line_number":25,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":"    username, password \u003d data.decode(\u0027base64\u0027).split(\u0027:\u0027, 1)"},{"line_number":28,"context_line":"    domain_id \u003d CONF.identity.default_domain_id"},{"line_number":29,"context_line":"    return username, password, domain_id"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_ba4ca6c9","line":27,"updated":"2014-06-04 04:26:24.000000000","message":"If the Authorization header is not correctly constructed and therefore we can\u0027t parse into username and password as designed should we explicitly catch this? For instance, if my Authorization header content (un-encoded) is \"Basic foobar\" I\u0027ll currently get an ugly error along the lines \"ValueError: need more than 1 value to pack\" in the case no colon is specified.","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"690bf55d0082847cb3e1beae10e631cd8c744add","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    scheme, data \u003d auth.split(None, 1)"},{"line_number":25,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":"    username, password \u003d data.decode(\u0027base64\u0027).split(\u0027:\u0027, 1)"},{"line_number":28,"context_line":"    domain_id \u003d CONF.identity.default_domain_id"},{"line_number":29,"context_line":"    return username, password, domain_id"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_61e537a7","line":27,"in_reply_to":"1ae5cdf2_ba4ca6c9","updated":"2014-06-11 01:48:34.000000000","message":"Agreed. Also the first split can fail.","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"2e09009ed77649c904416c3e29b09d6a6a126e2a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        auth \u003d request.environ.get(\u0027HTTP_AUTHORIZATION\u0027)"},{"line_number":40,"context_line":"        if auth:"},{"line_number":41,"context_line":"            user_id, password, domain_id \u003d _parse_auth_data(auth)"},{"line_number":42,"context_line":"            self.identity_api.authenticate(None,"},{"line_number":43,"context_line":"                                           user_id,"},{"line_number":44,"context_line":"                                           password)"},{"line_number":45,"context_line":"        request.environ[\u0027REMOTE_USER\u0027] \u003d user_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_8bf87ec4","line":42,"updated":"2014-06-04 05:51:10.000000000","message":"Where is domain_id used  in this method?","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b3d0c0d6f0df101c4fb4a052f32496e45b4dd6b2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    try:"},{"line_number":25,"context_line":"        scheme, data \u003d auth.split(None, 1)"},{"line_number":26,"context_line":"    except ValueError:"},{"line_number":27,"context_line":"        raise exception.Unauthorized()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":30,"context_line":"        raise exception.Unauthorized()"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_0b264dce","line":27,"updated":"2014-06-11 03:56:30.000000000","message":"I\u0027d like to see messages for the exceptions being raised here.","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b3d0c0d6f0df101c4fb4a052f32496e45b4dd6b2","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    except ValueError:"},{"line_number":35,"context_line":"        raise exception.Unauthorized()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    domain_id \u003d CONF.identity.default_domain_id"},{"line_number":38,"context_line":"    return username, password, domain_id"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_8b197d8a","line":37,"updated":"2014-06-11 03:56:30.000000000","message":"why fetch domain_id, it\u0027s returned but never used","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5fdfb4a9fa3a46ff6b1202739b2a1c83627bd843","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    except ValueError:"},{"line_number":35,"context_line":"        raise exception.Unauthorized()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    domain_id \u003d CONF.identity.default_domain_id"},{"line_number":38,"context_line":"    return username, password, domain_id"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_aed6474d","line":37,"in_reply_to":"1ae5cdf2_8b197d8a","updated":"2014-06-11 04:19:31.000000000","message":"yeah, i wanted to ask ayoung about that - i was going to remove all of the domain_id stuff because the default will be the default id anyway,  but i didn\u0027t know if he had other plans","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b3d0c0d6f0df101c4fb4a052f32496e45b4dd6b2","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        auth \u003d request.environ.get(\u0027HTTP_AUTHORIZATION\u0027)"},{"line_number":49,"context_line":"        if auth:"},{"line_number":50,"context_line":"            user_id, password, domain_id \u003d _parse_auth_data(auth)"},{"line_number":51,"context_line":"            self.identity_api.authenticate(None,"},{"line_number":52,"context_line":"                                           user_id,"},{"line_number":53,"context_line":"                                           password)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_ab1e396e","line":50,"updated":"2014-06-11 03:56:30.000000000","message":"no need for domain_id to be returned - you have the user_id which should be unique","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"051e069c0f25a45424e1155c1ad1f994229254ab","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    except ValueError:"},{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":29,"context_line":"        raise exception.Unauthorized()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_0893b75c","line":28,"updated":"2014-07-31 20:14:28.000000000","message":"Doing this would mean that you couldn\u0027t use this middleware with any other middleware that uses HTTP authorization. For example, digest auth or oauth. I think if the scheme is basic we process it and it not we let someone else deal with it.","commit_id":"aa398dedb347c1594a6920bdb3aa67406b2f8f86"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"949cdafab6d1d27409221abd085ad1c8de7514ba","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    except ValueError:"},{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":29,"context_line":"        raise exception.Unauthorized()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_922b697b","line":28,"in_reply_to":"baada198_0893b75c","updated":"2014-08-01 01:55:17.000000000","message":"++","commit_id":"aa398dedb347c1594a6920bdb3aa67406b2f8f86"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"051e069c0f25a45424e1155c1ad1f994229254ab","unresolved":false,"context_lines":[{"line_number":40,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":41,"context_line":"class BasicAuthMiddleware(wsgi.Middleware):"},{"line_number":42,"context_line":"    def process_request(self, request):"},{"line_number":43,"context_line":"        authorization_header \u003d request.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"        if not authorization_header:"},{"line_number":45,"context_line":"            return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_88d18731","line":43,"updated":"2014-07-31 20:14:28.000000000","message":"Why uses headers here and the environment variable below?","commit_id":"aa398dedb347c1594a6920bdb3aa67406b2f8f86"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"949cdafab6d1d27409221abd085ad1c8de7514ba","unresolved":false,"context_lines":[{"line_number":40,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":41,"context_line":"class BasicAuthMiddleware(wsgi.Middleware):"},{"line_number":42,"context_line":"    def process_request(self, request):"},{"line_number":43,"context_line":"        authorization_header \u003d request.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"        if not authorization_header:"},{"line_number":45,"context_line":"            return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_722ed58e","line":43,"in_reply_to":"baada198_88d18731","updated":"2014-08-01 01:55:17.000000000","message":"++","commit_id":"aa398dedb347c1594a6920bdb3aa67406b2f8f86"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"949cdafab6d1d27409221abd085ad1c8de7514ba","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def process_request(self, request):"},{"line_number":43,"context_line":"        authorization_header \u003d request.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"        if not authorization_header:"},{"line_number":45,"context_line":"            return"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        auth \u003d request.environ.get(\u0027HTTP_AUTHORIZATION\u0027)"},{"line_number":48,"context_line":"        if auth:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_72b3354e","line":45,"updated":"2014-08-01 01:55:17.000000000","message":"why not use something like:\n\nif \u0027Authorization\u0027 not in request.headers:\n    return\n\nAlso, is there a test for missing key in the headers? I couldn\u0027t find any.","commit_id":"aa398dedb347c1594a6920bdb3aa67406b2f8f86"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a8a4ec6fca8abce0e5048bbc845f792d3ef7783c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":41,"context_line":"class BasicAuthMiddleware(wsgi.Middleware):"},{"line_number":42,"context_line":"    def process_request(self, request):"},{"line_number":43,"context_line":"        authorization_header \u003d request.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"        if not authorization_header:"},{"line_number":45,"context_line":"            return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_22e2d39f","line":43,"updated":"2014-10-20 04:32:05.000000000","message":"I think quite a few different protocols use this header to dump authZ data. I\u0027m not sure what the flow is here, I\u0027m worried we are working ourselves into a corner by depending on \u0027basic\u0027 being found at line 27ish.\n\nHow is this class consumed? nothing actually uses this class today, and there is no proposal to use it.","commit_id":"3b9c3e305fc23b2644f02b212bdf3b24412b5f3c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f71aafd0ab558d7674ec85123408c11cf7541f2b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":41,"context_line":"class BasicAuthMiddleware(wsgi.Middleware):"},{"line_number":42,"context_line":"    def process_request(self, request):"},{"line_number":43,"context_line":"        authorization_header \u003d request.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"        if not authorization_header:"},{"line_number":45,"context_line":"            return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_40a6ce11","line":43,"in_reply_to":"9aa7fdbe_22e2d39f","updated":"2014-10-21 01:39:18.000000000","message":"This is explicitly the Basic-Auth middleware, so it makes sense that the authorization field is expected to have the Basic auth in it.  We could make a more complex solution for other simplistice mechanisms, but there is no real call for it.\n\nThis class, if put in the pipeline, would let a user make authenticated calls to Keystone without having an explicit token, and instead just userid and password.\n\nSee the spec.","commit_id":"3b9c3e305fc23b2644f02b212bdf3b24412b5f3c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e5338edba7816fcdc03ccb6769928bc619b804ca","unresolved":false,"context_lines":[{"line_number":40,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":41,"context_line":"class BasicAuthMiddleware(wsgi.Middleware):"},{"line_number":42,"context_line":"    def process_request(self, request):"},{"line_number":43,"context_line":"        authorization_header \u003d request.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"        if not authorization_header:"},{"line_number":45,"context_line":"            return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_20ef0a20","line":43,"in_reply_to":"9aa7fdbe_40a6ce11","updated":"2014-10-21 01:44:47.000000000","message":"Ahh here it is, https://review.openstack.org/#/c/125457/\n\nput this in the commit msg, i didn\u0027t know it existed.","commit_id":"3b9c3e305fc23b2644f02b212bdf3b24412b5f3c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f8c5ffc599e6e0900fbcec4037aae0dfe898266e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            self.identity_api.authenticate(None,"},{"line_number":51,"context_line":"                                           user_id,"},{"line_number":52,"context_line":"                                           password)"},{"line_number":53,"context_line":"        request.environ[\u0027REMOTE_USER\u0027] \u003d user_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_2e043ebf","line":53,"updated":"2014-11-12 10:05:32.000000000","message":"so, once the user is really authenticated his uesr_id will be stored under \u0027REMOTE_USER\u0027 and what else, somewhere in auth.controlers authentication method will be fired again?","commit_id":"3b9c3e305fc23b2644f02b212bdf3b24412b5f3c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"23e38b64d73752b24c95b8f8bd3ac5a3e1872f1f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            self.identity_api.authenticate(None,"},{"line_number":51,"context_line":"                                           user_id,"},{"line_number":52,"context_line":"                                           password)"},{"line_number":53,"context_line":"        request.environ[\u0027REMOTE_USER\u0027] \u003d user_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_48133166","line":53,"in_reply_to":"5a890539_2e043ebf","updated":"2014-11-12 17:10:45.000000000","message":"I\u0027d expect that the external plugin would come in to play, but by doing it as middleware, we could do more complex logic if we desired as well.","commit_id":"3b9c3e305fc23b2644f02b212bdf3b24412b5f3c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"ff4edaea16f9ccb08ae19922ef26996225502826","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            self.identity_api.authenticate(None,"},{"line_number":51,"context_line":"                                           user_id,"},{"line_number":52,"context_line":"                                           password)"},{"line_number":53,"context_line":"        request.environ[\u0027REMOTE_USER\u0027] \u003d user_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_1c84f80a","line":53,"in_reply_to":"5a890539_48133166","updated":"2014-11-13 10:49:24.000000000","message":"slightly suboptimal :(","commit_id":"3b9c3e305fc23b2644f02b212bdf3b24412b5f3c"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"72a8aaf6c068f5299525570cd4b19ee5cc7e2389","unresolved":false,"context_lines":[{"line_number":19,"context_line":"CONF \u003d config.CONF"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def _parse_auth_data(auth):"},{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        scheme, data \u003d auth.split(None, 1)"},{"line_number":25,"context_line":"    except ValueError:"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_ecbd96b8","line":22,"updated":"2015-02-04 07:40:45.000000000","message":"I would like to see some docstring here explaining this function","commit_id":"4644ed6939539a4437f7e96ea31058cca03ffccc"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"72a8aaf6c068f5299525570cd4b19ee5cc7e2389","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        scheme, data \u003d auth.split(None, 1)"},{"line_number":25,"context_line":"    except ValueError:"},{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":29,"context_line":"        raise exception.Unauthorized()"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_8cd97a24","line":26,"updated":"2015-02-04 07:40:45.000000000","message":"Could be relevant to raise this exception to LOG file?","commit_id":"4644ed6939539a4437f7e96ea31058cca03ffccc"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"6e42c65b600aaa3c359e47b8d2fa36baa2eee5a5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        scheme, data \u003d auth.split(None, 1)"},{"line_number":25,"context_line":"    except ValueError:"},{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":29,"context_line":"        raise exception.Unauthorized()"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_1643d46c","line":26,"in_reply_to":"da86d52c_8cd97a24","updated":"2015-02-04 11:32:39.000000000","message":"I think exception logging is to be done in a caller, not in the callee. Although I assume it would be good to have more informative exception message.","commit_id":"4644ed6939539a4437f7e96ea31058cca03ffccc"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"72a8aaf6c068f5299525570cd4b19ee5cc7e2389","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        raise exception.Unauthorized()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    if scheme.lower() !\u003d \u0027basic\u0027:"},{"line_number":29,"context_line":"        raise exception.Unauthorized()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    try:"},{"line_number":32,"context_line":"        username, password \u003d data.decode(\u0027base64\u0027).split(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_6cd0c6f6","line":29,"updated":"2015-02-04 07:40:45.000000000","message":"Could be relevant to raise this exception to LOG file?","commit_id":"4644ed6939539a4437f7e96ea31058cca03ffccc"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"72a8aaf6c068f5299525570cd4b19ee5cc7e2389","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    try:"},{"line_number":32,"context_line":"        username, password \u003d data.decode(\u0027base64\u0027).split(\u0027:\u0027, 1)"},{"line_number":33,"context_line":"    except ValueError:"},{"line_number":34,"context_line":"        raise exception.Unauthorized()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    domain_id \u003d CONF.identity.default_domain_id"},{"line_number":37,"context_line":"    return username, password, domain_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_2c024e6f","line":34,"updated":"2015-02-04 07:40:45.000000000","message":"Could be relevant to raise this exception to LOG file?","commit_id":"4644ed6939539a4437f7e96ea31058cca03ffccc"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"72a8aaf6c068f5299525570cd4b19ee5cc7e2389","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    except ValueError:"},{"line_number":34,"context_line":"        raise exception.Unauthorized()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    domain_id \u003d CONF.identity.default_domain_id"},{"line_number":37,"context_line":"    return username, password, domain_id"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_8c75fafb","line":36,"updated":"2015-02-04 07:40:45.000000000","message":"I don\u0027t know if is possible but just call some function to obtain the default domain_id, instead of access to config file...","commit_id":"4644ed6939539a4437f7e96ea31058cca03ffccc"}],"keystone/tests/test_middleware.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1abdfb279dc6f9e2057e318c9f287d194c879f90","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            req \u003d make_request(body\u003d\u0027{}\u0027,"},{"line_number":188,"context_line":"                               content_type\u003d\u0027application/json\u0027,"},{"line_number":189,"context_line":"                               method\u003d\u0027POST\u0027)"},{"line_number":190,"context_line":"            req.headers[\u0027Authorization\u0027] \u003d \u0027Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ\u003d\u003d\u0027"},{"line_number":191,"context_line":"            basic_auth.BasicAuthMiddleware(None).process_request(req)"},{"line_number":192,"context_line":"            self.assertEqual(\u0027Aladdin\u0027, req.environ[\u0027REMOTE_USER\u0027])"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_bc7241ab","line":190,"updated":"2014-05-09 17:55:53.000000000","message":"Using the encoded string directly here makes the test to not seem \"real\" to me, wouldn\u0027t be better do something like:\n\nusername \u003d \u0027Alladin\u0027\n\npassword \u003d \u0027open sesame\u0027\n\nreq.headers[\u0027Authorization\u0027] \u003d \u0027Basic \u0027 + base64.b64encode(username + \u0027:\u0027 + password)","commit_id":"d4d1abfe005bd931ce455ce11aa6d04e8a90b2c6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b05d750ed2d0ede7cfaf159ac40860076ed9418","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            req \u003d make_request(body\u003d\u0027{}\u0027,"},{"line_number":199,"context_line":"                               content_type\u003d\u0027application/json\u0027,"},{"line_number":200,"context_line":"                               method\u003d\u0027POST\u0027)"},{"line_number":201,"context_line":"            req.headers[\u0027Authorization\u0027] \u003d \u0027Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ\u003d\u003d\u0027"},{"line_number":202,"context_line":"            middleware \u003d basic_auth.BasicAuthMiddleware(None)"},{"line_number":203,"context_line":"            self.assertRaises(exception.UserNotFound,"},{"line_number":204,"context_line":"                              middleware.process_request,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_945578c8","line":201,"updated":"2014-05-27 21:14:21.000000000","message":"Suggest using a non-static password. This can be done via a method to reduce duplication of code in the test (every test does basically the same thing), perhaps an instance property of the [\u0027Authorization\u0027] header.","commit_id":"d4d1abfe005bd931ce455ce11aa6d04e8a90b2c6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"690bf55d0082847cb3e1beae10e631cd8c744add","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import base64"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":"import webob"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common import dependency"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_86f7b958","line":16,"updated":"2014-06-11 01:48:34.000000000","message":"Newline here to split off the stdlib modules into their own section.","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"690bf55d0082847cb3e1beae10e631cd8c744add","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def authenticate(self, context, user_id, password, domain_scope\u003dNone):"},{"line_number":177,"context_line":"        test_user_password \u003d self._users.get(user_id)"},{"line_number":178,"context_line":"        if test_user_password is None:"},{"line_number":179,"context_line":"            raise(exception.UserNotFound(user_id))"},{"line_number":180,"context_line":"        if test_user_password !\u003d password:"},{"line_number":181,"context_line":"            raise(exception.UserNotFound(user_id))"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_268985ca","line":179,"updated":"2014-06-11 01:48:34.000000000","message":"What are the extra parens for?","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"690bf55d0082847cb3e1beae10e631cd8c744add","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        if test_user_password is None:"},{"line_number":179,"context_line":"            raise(exception.UserNotFound(user_id))"},{"line_number":180,"context_line":"        if test_user_password !\u003d password:"},{"line_number":181,"context_line":"            raise(exception.UserNotFound(user_id))"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"class BasicAuthMiddlewareTest(tests.TestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_4684d1b0","line":181,"updated":"2014-06-11 01:48:34.000000000","message":"...and here","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"690bf55d0082847cb3e1beae10e631cd8c744add","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                \u0027Basic \u0027 + base64.b64encode(username + \u0027:\u0027 + password))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        def test_basic_auth_success(self):"},{"line_number":190,"context_line":"            mock_id \u003d MockIdentity()"},{"line_number":191,"context_line":"            username \u003d uuid.uuid4().hex"},{"line_number":192,"context_line":"            password \u003d uuid.uuid4().hex"},{"line_number":193,"context_line":"            mock_id.valid_user(username, password)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_a18f3f22","line":190,"updated":"2014-06-11 01:48:34.000000000","message":"These 4 lines can probably be put in a setUp since they are duplicated.","commit_id":"4422d0fded2e78866558b5ee5bbea7cc11a0ee15"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b3d0c0d6f0df101c4fb4a052f32496e45b4dd6b2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from keystone import exception"},{"line_number":23,"context_line":"from keystone import middleware"},{"line_number":24,"context_line":"from keystone.middleware import basic_auth"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from keystone.openstack.common import jsonutils"},{"line_number":27,"context_line":"from keystone import tests"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_0b0d6d3e","line":25,"updated":"2014-06-11 03:56:30.000000000","message":"nit, useless new line","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5fdfb4a9fa3a46ff6b1202739b2a1c83627bd843","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from keystone import exception"},{"line_number":23,"context_line":"from keystone import middleware"},{"line_number":24,"context_line":"from keystone.middleware import basic_auth"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from keystone.openstack.common import jsonutils"},{"line_number":27,"context_line":"from keystone import tests"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_ae3d6791","line":25,"in_reply_to":"1ae5cdf2_0b0d6d3e","updated":"2014-06-11 04:19:31.000000000","message":"Done","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b3d0c0d6f0df101c4fb4a052f32496e45b4dd6b2","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self.assertEqual(self.username, req.environ[\u0027REMOTE_USER\u0027])"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def test_basic_auth_bad_password(self):"},{"line_number":207,"context_line":"        req \u003d self.make_request(self.username, \u0027invalid\u0027)"},{"line_number":208,"context_line":"        basic_auth_middleware \u003d basic_auth.BasicAuthMiddleware(None)"},{"line_number":209,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":210,"context_line":"                          basic_auth_middleware.process_request,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_6b00b102","line":207,"updated":"2014-06-11 03:56:30.000000000","message":"could use uuid.uuid4.hex instead of \u0027invalid\u0027, as you do it for \u0027bad_user\u0027 test","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5fdfb4a9fa3a46ff6b1202739b2a1c83627bd843","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self.assertEqual(self.username, req.environ[\u0027REMOTE_USER\u0027])"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def test_basic_auth_bad_password(self):"},{"line_number":207,"context_line":"        req \u003d self.make_request(self.username, \u0027invalid\u0027)"},{"line_number":208,"context_line":"        basic_auth_middleware \u003d basic_auth.BasicAuthMiddleware(None)"},{"line_number":209,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":210,"context_line":"                          basic_auth_middleware.process_request,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_4e5223df","line":207,"in_reply_to":"1ae5cdf2_6b00b102","updated":"2014-06-11 04:19:31.000000000","message":"Done","commit_id":"ba73c4e13ec11328295f0b4a0a54a8919abf4d72"}]}
