diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5bd1fbeb..1b185b53 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,6 +8,7 @@ TBD - Added support for display name to command decorator - Updated Wait Timeout Exception expected HTTP code from 408 to 504 - Dropping Official Python 2.7 Support +- Update Bytes file download to validate MD5 checksum 3.29.0 ------ diff --git a/brewtils/resolvers/bytes.py b/brewtils/resolvers/bytes.py index 0391a16c..e70d7ab5 100644 --- a/brewtils/resolvers/bytes.py +++ b/brewtils/resolvers/bytes.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +from hashlib import md5 + +from brewtils.errors import ValidationError from brewtils.resolvers import ResolverBase @@ -19,4 +22,16 @@ def should_download(self, value, definition): return definition.type.lower() == "bytes" def download(self, value, definition): - return self.easy_client.download_bytes(value.id) + file_bytes = self.easy_client.download_bytes(value.id) + + if value.details: + if ( + "md5_sum" in value.details + and value.details["md5_sum"] + != md5(file_bytes.decode("utf-8").encode("utf-8")).hexdigest() + ): + raise ValidationError( + "Requested file %s MD5 SUM %s does match actual MD5 SUM %s" + % (value.id, value.details["md5_sum"], md5(value).hexdigest()) + ) + return file_bytes