)]}'
{"ironic_lib/auth_basic.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4605a58c7e30e55c2bd95508d3c837d13c656d0f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            return self.app(env, start_response)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        except exception.IronicException as e:"},{"line_number":44,"context_line":"            status \u003d \u0027%s %s\u0027 % (e.code.value, str(e))"},{"line_number":45,"context_line":"            headers \u003d [(k, v) for k, v in e.headers.items()]"},{"line_number":46,"context_line":"            start_response(status, headers)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ff570b3c_c01684a8","line":44,"range":{"start_line":44,"start_character":32,"end_line":44,"end_character":44},"updated":"2020-05-20 00:40:47.000000000","message":"This should be int(e.code)","commit_id":"322e587d94e4014eb8806f5747cdaa73ea0fd1b6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_1fd08bc9","line":1,"updated":"2020-05-25 09:29:51.000000000","message":"nit: I think at some point we had a pep8 rule against using these","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_917f67aa","line":1,"in_reply_to":"ff570b3c_1fd08bc9","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                    return auth_entry(entry, password)"},{"line_number":71,"context_line":"    except OSError:"},{"line_number":72,"context_line":"        raise exception.ConfigInvalid("},{"line_number":73,"context_line":"            error_msg\u003d\u0027Problem reading auth user file\u0027)"},{"line_number":74,"context_line":"    # reached end of file with no matches"},{"line_number":75,"context_line":"    unauthorized()"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_ffd4b7bf","line":73,"updated":"2020-05-25 09:29:51.000000000","message":"missing  _() here and in a few other user-visible errors","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                    return auth_entry(entry, password)"},{"line_number":71,"context_line":"    except OSError:"},{"line_number":72,"context_line":"        raise exception.ConfigInvalid("},{"line_number":73,"context_line":"            error_msg\u003d\u0027Problem reading auth user file\u0027)"},{"line_number":74,"context_line":"    # reached end of file with no matches"},{"line_number":75,"context_line":"    unauthorized()"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_315bfb54","line":73,"in_reply_to":"ff570b3c_ffd4b7bf","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    crypted \u003d crypted_str.encode(\u0027utf-8\u0027)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    if not crypted.startswith(b\u0027$2y$\u0027):"},{"line_number":127,"context_line":"        error_msg \u003d (\u0027Only bcrypt digested passwords are supported for \u0027"},{"line_number":128,"context_line":"                     \u0027%(username)s\u0027 % {\u0027username\u0027: username})"},{"line_number":129,"context_line":"        raise exception.ConfigInvalid(error_msg\u003derror_msg)"},{"line_number":130,"context_line":"    return username, crypted"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_5fd963f2","line":127,"updated":"2020-05-25 09:29:51.000000000","message":"nit: missing _() around a user error","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    crypted \u003d crypted_str.encode(\u0027utf-8\u0027)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    if not crypted.startswith(b\u0027$2y$\u0027):"},{"line_number":127,"context_line":"        error_msg \u003d (\u0027Only bcrypt digested passwords are supported for \u0027"},{"line_number":128,"context_line":"                     \u0027%(username)s\u0027 % {\u0027username\u0027: username})"},{"line_number":129,"context_line":"        raise exception.ConfigInvalid(error_msg\u003derror_msg)"},{"line_number":130,"context_line":"    return username, crypted"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_91580757","line":127,"in_reply_to":"ff570b3c_5fd963f2","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    \"\"\""},{"line_number":141,"context_line":"    try:"},{"line_number":142,"context_line":"        if isinstance(token, str):"},{"line_number":143,"context_line":"            token \u003d bytes(token, encoding\u003d\u0027utf-8\u0027)"},{"line_number":144,"context_line":"        auth_pair \u003d base64.b64decode(token, validate\u003dTrue)"},{"line_number":145,"context_line":"        (username, password) \u003d auth_pair.split(b\u0027:\u0027, maxsplit\u003d1)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_3fd62fc5","line":143,"updated":"2020-05-25 09:29:51.000000000","message":"nit: token.encode(\u0027utf-8\u0027)","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    \"\"\""},{"line_number":141,"context_line":"    try:"},{"line_number":142,"context_line":"        if isinstance(token, str):"},{"line_number":143,"context_line":"            token \u003d bytes(token, encoding\u003d\u0027utf-8\u0027)"},{"line_number":144,"context_line":"        auth_pair \u003d base64.b64decode(token, validate\u003dTrue)"},{"line_number":145,"context_line":"        (username, password) \u003d auth_pair.split(b\u0027:\u0027, maxsplit\u003d1)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_7155731d","line":143,"in_reply_to":"ff570b3c_3fd62fc5","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        auth_pair \u003d base64.b64decode(token, validate\u003dTrue)"},{"line_number":145,"context_line":"        (username, password) \u003d auth_pair.split(b\u0027:\u0027, maxsplit\u003d1)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_9fe3fba4","line":147,"updated":"2020-05-25 09:29:51.000000000","message":"nit: username.decode(\u0027utf-8\u0027)","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        auth_pair \u003d base64.b64decode(token, validate\u003dTrue)"},{"line_number":145,"context_line":"        (username, password) \u003d auth_pair.split(b\u0027:\u0027, maxsplit\u003d1)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_d12f1fa5","line":147,"in_reply_to":"ff570b3c_9fe3fba4","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_7fe0a797","line":149,"updated":"2020-05-25 09:29:51.000000000","message":"nit: two unicode errors can be replaced with UnicodeError, which, in turn, as a subclass of ValueError.\n\nalso s/base64.// (binascii is a separate module)","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_712a9390","line":149,"in_reply_to":"ff570b3c_7fe0a797","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def parse_header(env):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_dfee138a","line":150,"updated":"2020-05-25 09:29:51.000000000","message":"let\u0027s LOG.error the actual error class and message, otherwise this is not debuggable\n\nalso missing _()","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b1478f93e56deebee622a9d934d1afbaf22847e3","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def parse_header(env):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_07c2f2e9","line":150,"in_reply_to":"ff570b3c_2c0e0032","updated":"2020-05-26 09:44:13.000000000","message":"Yes, but when the client is another piece of software (think, BMO in metal3), it may be useful to track the problem.","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        return (str(username, encoding\u003d\u0027utf-8\u0027), password)"},{"line_number":148,"context_line":"    except (TypeError, UnicodeEncodeError, base64.binascii.Error,"},{"line_number":149,"context_line":"            ValueError, UnicodeDecodeError):"},{"line_number":150,"context_line":"        raise exception.BadRequest(\u0027Could not decode authorization token\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def parse_header(env):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_2c0e0032","line":150,"in_reply_to":"ff570b3c_dfee138a","updated":"2020-05-25 21:44:01.000000000","message":"Hmm, is it useful or appropriate for the server to log errors for incorrect client-side implementations of http basic auth? The client is told there is a problem, that should be enough for them to fix it to the spec.","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"}],"releasenotes/notes/basic-auth-middleware-e5af29651b2d7979.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ff570b3c_bff35f73","updated":"2020-05-25 09:29:51.000000000","message":"This project doesn\u0027t publish release notes","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c8b7a75bfadca9df1b2ce2dca6075012c8b17051","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Implement Basic HTTP authentication middleware."},{"line_number":5,"context_line":"    "},{"line_number":6,"context_line":"    This middleware is added to ironic-lib so that it can eventually be"},{"line_number":7,"context_line":"    used by ironic and ironic-inspector as an alternative to noauth in"},{"line_number":8,"context_line":"    standalone environments."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"ff570b3c_1fe9ab7f","line":5,"updated":"2020-05-25 09:29:51.000000000","message":"nit: trailing spaces here and below","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"40fbd5eee639f5bb13fee39338402db469a77e64","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Implement Basic HTTP authentication middleware."},{"line_number":5,"context_line":"    "},{"line_number":6,"context_line":"    This middleware is added to ironic-lib so that it can eventually be"},{"line_number":7,"context_line":"    used by ironic and ironic-inspector as an alternative to noauth in"},{"line_number":8,"context_line":"    standalone environments."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"ff570b3c_8c1bcc71","line":5,"in_reply_to":"ff570b3c_1fe9ab7f","updated":"2020-05-25 21:44:01.000000000","message":"Done","commit_id":"20a91a21a5afddcab6a70a38aaef792fb38807ec"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d0279fd64e8ba14148163d65c5144224dc475124","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"ff570b3c_ec450c72","updated":"2020-05-27 09:11:58.000000000","message":"This file can be removed, we don\u0027t build or publish release notes right now (since this library is not user-consumable)","commit_id":"a9abc5699f0842082177ff2401955214373c08de"}]}
