)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca30ed2f69cecc6c87487aeda49962a8ff44f82b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add S3 signature v4 checking"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Keystone can check signature v1 for s3."},{"line_number":10,"context_line":"but many new tools uses new v4 signature protocol."},{"line_number":11,"context_line":"This patchset adds checking of v4 signature like"},{"line_number":12,"context_line":"v1 implemented."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"da20952f_2cdc94e3","line":9,"updated":"2015-08-27 13:49:54.000000000","message":"(nit) replace the period with a comma","commit_id":"32dbd06b22c808fec0063870a285a1d4c1acbd6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca30ed2f69cecc6c87487aeda49962a8ff44f82b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Keystone can check signature v1 for s3."},{"line_number":10,"context_line":"but many new tools uses new v4 signature protocol."},{"line_number":11,"context_line":"This patchset adds checking of v4 signature like"},{"line_number":12,"context_line":"v1 implemented."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I14121b4df2cae1407102335671c3f6878d46fc35"},{"line_number":15,"context_line":"Closes-Bug: #1473042"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"da20952f_acee6489","line":12,"updated":"2015-08-27 13:49:54.000000000","message":"s/like v1 implemented// because i don\u0027t think v1 implemented v4","commit_id":"32dbd06b22c808fec0063870a285a1d4c1acbd6d"}],"keystone/contrib/s3/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca30ed2f69cecc6c87487aeda49962a8ff44f82b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":"from keystoneclient.contrib.ec2.utils import Ec2Signer"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Main entry point into the S3 Credentials service."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_58a18793","line":14,"updated":"2015-08-27 13:49:54.000000000","message":"Why is this up here instead of with the other imports?","commit_id":"32dbd06b22c808fec0063870a285a1d4c1acbd6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca30ed2f69cecc6c87487aeda49962a8ff44f82b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        def sign(key, msg):"},{"line_number":107,"context_line":"            return hmac.new(key, Ec2Signer._get_utf8_value(msg),"},{"line_number":108,"context_line":"                            hashlib.sha256).digest()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        signed \u003d sign(Ec2Signer._get_utf8_value(six.b(\"AWS4\" + secret_key)),"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_b8dd4316","line":107,"updated":"2015-08-27 13:49:54.000000000","message":"This is using a non-public API","commit_id":"32dbd06b22c808fec0063870a285a1d4c1acbd6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca30ed2f69cecc6c87487aeda49962a8ff44f82b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            return hmac.new(key, Ec2Signer._get_utf8_value(msg),"},{"line_number":108,"context_line":"                            hashlib.sha256).digest()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        signed \u003d sign(Ec2Signer._get_utf8_value(six.b(\"AWS4\" + secret_key)),"},{"line_number":111,"context_line":"                      scope[0])"},{"line_number":112,"context_line":"        signed \u003d sign(signed, scope[1])"},{"line_number":113,"context_line":"        signed \u003d sign(signed, scope[2])"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_f8c41b41","line":110,"updated":"2015-08-27 13:49:54.000000000","message":"This is using a non-public API","commit_id":"32dbd06b22c808fec0063870a285a1d4c1acbd6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca30ed2f69cecc6c87487aeda49962a8ff44f82b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        signed \u003d sign(signed, scope[2])"},{"line_number":114,"context_line":"        signed \u003d sign(signed, \u0027aws4_request\u0027)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        signature \u003d hmac.new(signed, Ec2Signer._get_utf8_value(string_to_sign),"},{"line_number":117,"context_line":"                             hashlib.sha256).hexdigest()"},{"line_number":118,"context_line":"        return signature"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_18d9cf21","line":116,"updated":"2015-08-27 13:49:54.000000000","message":"This is using a non-public API","commit_id":"32dbd06b22c808fec0063870a285a1d4c1acbd6d"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"6c6e355dd307ec34c739f21a4fcc350834c17a8f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                                    creds_ref[\u0027secret\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not utils.auth_str_equal(credentials[\u0027signature\u0027], signature):"},{"line_number":80,"context_line":"            raise exception.Unauthorized(\u0027Credential signature mismatch\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def calculate_signature_v1(self, string_to_sign, secret_key):"},{"line_number":83,"context_line":"        key \u003d str(secret_key).encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_90ab60d6","line":80,"updated":"2015-10-29 14:19:59.000000000","message":"message\u003d_(\u0027error\u0027)","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8740b1a6e21f34f81fa27f0650c2be62dfb605a5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                                    creds_ref[\u0027secret\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not utils.auth_str_equal(credentials[\u0027signature\u0027], signature):"},{"line_number":80,"context_line":"            raise exception.Unauthorized(\u0027Credential signature mismatch\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def calculate_signature_v1(self, string_to_sign, secret_key):"},{"line_number":83,"context_line":"        key \u003d str(secret_key).encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_fce06bce","line":80,"in_reply_to":"1a26ad4f_90ab60d6","updated":"2015-10-29 15:16:45.000000000","message":"Done","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"6c6e355dd307ec34c739f21a4fcc350834c17a8f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                            .digest()).decode(\u0027utf-8\u0027).strip()"},{"line_number":90,"context_line":"        return signed"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def calculate_signature_v4(self, string_to_sign, secret_key):"},{"line_number":93,"context_line":"        if six.PY3:"},{"line_number":94,"context_line":"            strings \u003d string_to_sign.decode(\u0027ascii\u0027).split(\u0027\\n\u0027)"},{"line_number":95,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_703b24d2","line":92,"updated":"2015-10-29 14:19:59.000000000","message":"This should be a private method","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8740b1a6e21f34f81fa27f0650c2be62dfb605a5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                            .digest()).decode(\u0027utf-8\u0027).strip()"},{"line_number":90,"context_line":"        return signed"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def calculate_signature_v4(self, string_to_sign, secret_key):"},{"line_number":93,"context_line":"        if six.PY3:"},{"line_number":94,"context_line":"            strings \u003d string_to_sign.decode(\u0027ascii\u0027).split(\u0027\\n\u0027)"},{"line_number":95,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_dcdd6f15","line":92,"in_reply_to":"1a26ad4f_703b24d2","updated":"2015-10-29 15:16:45.000000000","message":"Done","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"6c6e355dd307ec34c739f21a4fcc350834c17a8f","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            strings \u003d string_to_sign.split(\u0027\\n\u0027)"},{"line_number":97,"context_line":"        if len(strings) !\u003d 4 or strings[0] !\u003d \u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":98,"context_line":"            raise exception.Unauthorized("},{"line_number":99,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":100,"context_line":"        scope \u003d strings[2].split(\u0027/\u0027)"},{"line_number":101,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d \u0027s3\u0027 or scope[3] !\u003d \u0027aws4_request\u0027:"},{"line_number":102,"context_line":"            raise exception.Unauthorized("}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_70424440","line":99,"updated":"2015-10-29 14:19:59.000000000","message":"This message should be i18n safe. Wrap it in _(\u0027errror\u0027)","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8740b1a6e21f34f81fa27f0650c2be62dfb605a5","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            strings \u003d string_to_sign.split(\u0027\\n\u0027)"},{"line_number":97,"context_line":"        if len(strings) !\u003d 4 or strings[0] !\u003d \u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":98,"context_line":"            raise exception.Unauthorized("},{"line_number":99,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":100,"context_line":"        scope \u003d strings[2].split(\u0027/\u0027)"},{"line_number":101,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d \u0027s3\u0027 or scope[3] !\u003d \u0027aws4_request\u0027:"},{"line_number":102,"context_line":"            raise exception.Unauthorized("}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_3cc0232a","line":99,"in_reply_to":"1a26ad4f_70424440","updated":"2015-10-29 15:16:45.000000000","message":"Done","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"6c6e355dd307ec34c739f21a4fcc350834c17a8f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        scope \u003d strings[2].split(\u0027/\u0027)"},{"line_number":101,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d \u0027s3\u0027 or scope[3] !\u003d \u0027aws4_request\u0027:"},{"line_number":102,"context_line":"            raise exception.Unauthorized("},{"line_number":103,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        def sign(key, msg):"},{"line_number":106,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_903da0bd","line":103,"updated":"2015-10-29 14:19:59.000000000","message":"ditto","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8740b1a6e21f34f81fa27f0650c2be62dfb605a5","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        scope \u003d strings[2].split(\u0027/\u0027)"},{"line_number":101,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d \u0027s3\u0027 or scope[3] !\u003d \u0027aws4_request\u0027:"},{"line_number":102,"context_line":"            raise exception.Unauthorized("},{"line_number":103,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        def sign(key, msg):"},{"line_number":106,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_7cc69b4a","line":103,"in_reply_to":"1a26ad4f_903da0bd","updated":"2015-10-29 15:16:45.000000000","message":"Done","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"6c6e355dd307ec34c739f21a4fcc350834c17a8f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            raise exception.Unauthorized("},{"line_number":103,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        def sign(key, msg):"},{"line_number":106,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"},{"line_number":107,"context_line":"                            hashlib.sha256).digest()"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_1078b08e","line":105,"updated":"2015-10-29 14:19:59.000000000","message":"If this is used just inside this class this should be a private method","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8740b1a6e21f34f81fa27f0650c2be62dfb605a5","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            raise exception.Unauthorized("},{"line_number":103,"context_line":"                message\u003d\u0027Invalid EC2 signature.\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        def sign(key, msg):"},{"line_number":106,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"},{"line_number":107,"context_line":"                            hashlib.sha256).digest()"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_5ccb9f53","line":105,"in_reply_to":"1a26ad4f_1078b08e","updated":"2015-10-29 15:16:45.000000000","message":"Done","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"6c6e355dd307ec34c739f21a4fcc350834c17a8f","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"},{"line_number":107,"context_line":"                            hashlib.sha256).digest()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        signed \u003d sign(self._get_utf8_value(six.b(\"AWS4\" + secret_key)),"},{"line_number":110,"context_line":"                      scope[0])"},{"line_number":111,"context_line":"        signed \u003d sign(signed, scope[1])"},{"line_number":112,"context_line":"        signed \u003d sign(signed, scope[2])"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_b0f3fc09","line":109,"updated":"2015-10-29 14:19:59.000000000","message":"\u0027AWS4\u0027","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8740b1a6e21f34f81fa27f0650c2be62dfb605a5","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"},{"line_number":107,"context_line":"                            hashlib.sha256).digest()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        signed \u003d sign(self._get_utf8_value(six.b(\"AWS4\" + secret_key)),"},{"line_number":110,"context_line":"                      scope[0])"},{"line_number":111,"context_line":"        signed \u003d sign(signed, scope[1])"},{"line_number":112,"context_line":"        signed \u003d sign(signed, scope[2])"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a26ad4f_bcb3d3e8","line":109,"in_reply_to":"1a26ad4f_b0f3fc09","updated":"2015-10-29 15:16:45.000000000","message":"Done","commit_id":"44439486eb2b2627e81d92c16c7ae477ac693d3d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fd73f866cad0522cd29cf11d0e06c5599e376f1","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _calculate_signature_v4(self, string_to_sign, secret_key):"},{"line_number":95,"context_line":"        if six.PY3:"},{"line_number":96,"context_line":"            strings \u003d string_to_sign.decode(\u0027ascii\u0027).split(\u0027\\n\u0027)"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            strings \u003d string_to_sign.split(\u0027\\n\u0027)"},{"line_number":99,"context_line":"        if len(strings) !\u003d 4 or strings[0] !\u003d \u0027AWS4-HMAC-SHA256\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a26ad4f_e5120b09","line":96,"updated":"2015-10-29 21:37:15.000000000","message":"Does \u0027string_to_sign\u0027 come in a bytes in Py3, but unicode in Py2? Later on \u0027string_to_sign\u0027 is passed into the _get_utf8_value method, which will have no effect in Py3. So I\u0027m wondering what effect it has in Py2.","commit_id":"71ec3e32ba0dddfe946315d7b6ecb25c54b8bbf7"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"047a712140cea60169e1c865cc8bee59a1323be6","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _calculate_signature_v4(self, string_to_sign, secret_key):"},{"line_number":95,"context_line":"        if six.PY3:"},{"line_number":96,"context_line":"            strings \u003d string_to_sign.decode(\u0027ascii\u0027).split(\u0027\\n\u0027)"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            strings \u003d string_to_sign.split(\u0027\\n\u0027)"},{"line_number":99,"context_line":"        if len(strings) !\u003d 4 or strings[0] !\u003d \u0027AWS4-HMAC-SHA256\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a26ad4f_dcd47848","line":96,"in_reply_to":"1a26ad4f_e5120b09","updated":"2015-10-30 07:56:52.000000000","message":"in py2 it comes as str type","commit_id":"71ec3e32ba0dddfe946315d7b6ecb25c54b8bbf7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fd73f866cad0522cd29cf11d0e06c5599e376f1","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            return hmac.new(key, self._get_utf8_value(msg),"},{"line_number":109,"context_line":"                            hashlib.sha256).digest()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        signed \u003d _sign(self._get_utf8_value(six.b(\u0027AWS4\u0027 + secret_key)),"},{"line_number":112,"context_line":"                       scope[0])"},{"line_number":113,"context_line":"        signed \u003d _sign(signed, scope[1])"},{"line_number":114,"context_line":"        signed \u003d _sign(signed, scope[2])"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a26ad4f_8597978f","line":111,"updated":"2015-10-29 21:37:15.000000000","message":"Is there any reason to use _get_uft8_value here? Won\u0027t this always be returned as-is because it\u0027s a bytes type?","commit_id":"71ec3e32ba0dddfe946315d7b6ecb25c54b8bbf7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7fd73f866cad0522cd29cf11d0e06c5599e376f1","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def _get_utf8_value(value):"},{"line_number":123,"context_line":"        \"\"\"Get the UTF8-encoded version of a value.\"\"\""},{"line_number":124,"context_line":"        if not isinstance(value, (six.binary_type, six.text_type)):"},{"line_number":125,"context_line":"            value \u003d str(value)"},{"line_number":126,"context_line":"        if isinstance(value, six.text_type):"},{"line_number":127,"context_line":"            return value.encode(\u0027utf-8\u0027)"},{"line_number":128,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a26ad4f_6a4a48ae","line":125,"updated":"2015-10-29 21:37:15.000000000","message":"This may not work in Python 3 because this will make the method return text instead of bytes. This isn\u0027t tested so I really don\u0027t know what it\u0027s here. Is it a just in case?","commit_id":"71ec3e32ba0dddfe946315d7b6ecb25c54b8bbf7"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"047a712140cea60169e1c865cc8bee59a1323be6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def _get_utf8_value(value):"},{"line_number":123,"context_line":"        \"\"\"Get the UTF8-encoded version of a value.\"\"\""},{"line_number":124,"context_line":"        if not isinstance(value, (six.binary_type, six.text_type)):"},{"line_number":125,"context_line":"            value \u003d str(value)"},{"line_number":126,"context_line":"        if isinstance(value, six.text_type):"},{"line_number":127,"context_line":"            return value.encode(\u0027utf-8\u0027)"},{"line_number":128,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a26ad4f_1cee70ec","line":125,"in_reply_to":"1a26ad4f_6a4a48ae","updated":"2015-10-30 07:56:52.000000000","message":"initially I got most code from another projects. and this function too.\nbut you are right - this block will not work here.","commit_id":"71ec3e32ba0dddfe946315d7b6ecb25c54b8bbf7"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"75a4442ffd0ea57ae934cbf4ca3cb8805a5b988b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def _calculate_signature_v1(self, string_to_sign, secret_key):"},{"line_number":85,"context_line":"        \"\"\"Calculates a v1 signature."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param bytes string_to_sign:"},{"line_number":88,"context_line":"        :param text secret_key:"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        key \u003d str(secret_key).encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_29451e6f","line":87,"updated":"2015-10-30 19:43:44.000000000","message":":param string_to_sign: description of string_to_sign\n\n:type string_to_sign: text","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"75a4442ffd0ea57ae934cbf4ca3cb8805a5b988b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Calculates a v1 signature."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param bytes string_to_sign:"},{"line_number":88,"context_line":"        :param text secret_key:"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        key \u003d str(secret_key).encode(\u0027utf-8\u0027)"},{"line_number":91,"context_line":"        if six.PY2:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_095b8255","line":88,"updated":"2015-10-30 19:43:44.000000000","message":"ditto","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"75a4442ffd0ea57ae934cbf4ca3cb8805a5b988b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def _calculate_signature_v4(self, string_to_sign, secret_key):"},{"line_number":100,"context_line":"        \"\"\"Calculates a v4 signature."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :param bytes string_to_sign:"},{"line_number":103,"context_line":"        :param text secret_key:"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_5ad5beb6","line":102,"updated":"2015-10-30 19:43:44.000000000","message":":param string_to_sign: Description of string_to_sign\n\n:type string_to_sign: bytes","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"75a4442ffd0ea57ae934cbf4ca3cb8805a5b988b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        \"\"\"Calculates a v4 signature."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :param bytes string_to_sign:"},{"line_number":103,"context_line":"        :param text secret_key:"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":106,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_0974e2cc","line":103,"updated":"2015-10-30 19:43:44.000000000","message":"ditto","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"98fa56373beb47cc533ea13291bfdbcd8954058e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":106,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":107,"context_line":"            raise exception.Unauthorized("},{"line_number":108,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":109,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":110,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_c21557e5","line":108,"updated":"2015-11-01 09:08:08.000000000","message":"this should be the token given is invalid rather than the signature is invalid, we are not validata the signature but the format of token.\n\npls change the message and the exception.","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"5aa9229a348550caaac39767fb6bd57a513d6853","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":106,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":107,"context_line":"            raise exception.Unauthorized("},{"line_number":108,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":109,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":110,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_a01ff36a","line":108,"in_reply_to":"1a26ad4f_c21557e5","updated":"2015-11-01 19:37:43.000000000","message":"I don\u0027t fully agree with this. EC2 signature doesn\u0027t have any object named \u0027token\u0027. Historically, this layer takes \u0027token\u0027 object but this object contains \u0027string_to_sign\u0027 object.\n\ndocs are here - http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html\n\nSecond reason is that this exception can be passed to user and this is not convenient for ec2 user to see message about token because he doesn\u0027t know what is it.\nMaybe it can be something like \u0027Invalid request\u0027 or \u0027Internal error\u0027...","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"98fa56373beb47cc533ea13291bfdbcd8954058e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":110,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("},{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        def _sign(key, msg):"},{"line_number":115,"context_line":"            return hmac.new(key, msg, hashlib.sha256).digest()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a26ad4f_02202f47","line":112,"updated":"2015-11-01 09:08:08.000000000","message":"same here.","commit_id":"34e10615975ff6c3136d459d881fc57f8d911c4f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b62862f26da5e5897b6b921c5f2b4d90246848d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":110,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("},{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":114,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_d4349c4b","line":111,"updated":"2015-11-08 16:45:20.000000000","message":"this case must be covered by the unit tests.","commit_id":"26b3ed94183265c013be0cc46626103c1387fb9a"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"a4fe11f6d4443d50ab61b095d440b75f731be7d8","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":110,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("},{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":114,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_48a1eca8","line":111,"in_reply_to":"da85f559_d4349c4b","updated":"2015-11-08 18:30:01.000000000","message":"Done","commit_id":"26b3ed94183265c013be0cc46626103c1387fb9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b62862f26da5e5897b6b921c5f2b4d90246848d","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":114,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"},{"line_number":115,"context_line":"            raise exception.Unauthorized("},{"line_number":116,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        def _sign(key, msg):"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_f439a042","line":115,"updated":"2015-11-08 16:45:20.000000000","message":"this case must be covered by the unit tests.","commit_id":"26b3ed94183265c013be0cc46626103c1387fb9a"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"a4fe11f6d4443d50ab61b095d440b75f731be7d8","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":114,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"},{"line_number":115,"context_line":"            raise exception.Unauthorized("},{"line_number":116,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        def _sign(key, msg):"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_68a630c3","line":115,"in_reply_to":"da85f559_f439a042","updated":"2015-11-08 18:30:01.000000000","message":"Done","commit_id":"26b3ed94183265c013be0cc46626103c1387fb9a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c703b167bdd39956ae96ca53c27c11e6cd12d093","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":110,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("},{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":114,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_cc9c0b6c","line":111,"updated":"2015-11-16 19:13:49.000000000","message":"this could be on one line","commit_id":"f11d396546dfe8fa66143d3aaddf5873268eda9d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"c828c3b207ee2d332a6cc5bf233068ff398164dc","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        parts \u003d string_to_sign.split(b\u0027\\n\u0027)"},{"line_number":110,"context_line":"        if len(parts) !\u003d 4 or parts[0] !\u003d b\u0027AWS4-HMAC-SHA256\u0027:"},{"line_number":111,"context_line":"            raise exception.Unauthorized("},{"line_number":112,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":113,"context_line":"        scope \u003d parts[2].split(b\u0027/\u0027)"},{"line_number":114,"context_line":"        if len(scope) !\u003d 4 or scope[2] !\u003d b\u0027s3\u0027 or scope[3] !\u003d b\u0027aws4_request\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_5310724e","line":111,"in_reply_to":"ba8a016a_cc9c0b6c","updated":"2015-11-17 20:38:49.000000000","message":"taking into account second comments - should I create new review only for this change?","commit_id":"f11d396546dfe8fa66143d3aaddf5873268eda9d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c703b167bdd39956ae96ca53c27c11e6cd12d093","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        def _sign(key, msg):"},{"line_number":119,"context_line":"            return hmac.new(key, msg, hashlib.sha256).digest()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        signed \u003d _sign(six.b(\u0027AWS4\u0027 + secret_key), scope[0])"},{"line_number":122,"context_line":"        signed \u003d _sign(signed, scope[1])"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_acc8a775","line":119,"updated":"2015-11-16 19:13:49.000000000","message":"according to http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python the msg variable should be utf8 encoded","commit_id":"f11d396546dfe8fa66143d3aaddf5873268eda9d"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"c828c3b207ee2d332a6cc5bf233068ff398164dc","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                message\u003d_(\u0027Invalid EC2 signature.\u0027))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        def _sign(key, msg):"},{"line_number":119,"context_line":"            return hmac.new(key, msg, hashlib.sha256).digest()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        signed \u003d _sign(six.b(\u0027AWS4\u0027 + secret_key), scope[0])"},{"line_number":122,"context_line":"        signed \u003d _sign(signed, scope[1])"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_585bb154","line":119,"in_reply_to":"ba8a016a_acc8a775","updated":"2015-11-17 20:38:49.000000000","message":"we pass only bytes to this func and seems that these bytes always utf8 decodable because they use only ASCII chars.\nscope[0] - timestamp\nscope[1] - region name\nscope[2] \u003d \u0027s3\u0027\n\nSo I think that no changes are needed at this line.","commit_id":"f11d396546dfe8fa66143d3aaddf5873268eda9d"}]}
