mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Add calculate_blake2b_hash to file_helpers.py
Adds calculate_blake2b_hash function to app\classes\shared\file_helpers.py Renames calculate_file_hash to calculate_file_hash_sha256 to avoid confusion between sha256 and blake2b hash functions.
This commit is contained in:
parent
d145dd595b
commit
f3db713f27
@ -151,7 +151,64 @@ class FileHelpers:
|
|||||||
return m_type
|
return m_type
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def calculate_file_hash(file_path: str) -> str:
|
def calculate_blake2b_hash(
|
||||||
|
value_to_hash: pathlib.Path | bytes, output_format: str = "hex"
|
||||||
|
) -> str or bytes:
|
||||||
|
"""
|
||||||
|
Calculates blake2b hash from either file at specified Path, or from supplied
|
||||||
|
bytes. Output will either be a hex string or bytes. Hex string is the default.
|
||||||
|
:param value_to_hash: Path to file or bytes to hash.
|
||||||
|
:param output_format: Output format, "hex" for hex in str, "bytes" for bytes.
|
||||||
|
output. Defaults to "hex".
|
||||||
|
:return: blake2b hash string or bytes.
|
||||||
|
"""
|
||||||
|
# Check input value
|
||||||
|
if isinstance(value_to_hash, bytes):
|
||||||
|
input_type = 1
|
||||||
|
elif isinstance(value_to_hash, pathlib.Path):
|
||||||
|
input_type = 2
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
f"value_to_hash must be either bytes or str, got: {type(value_to_hash)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Hash input value
|
||||||
|
blake2 = hashlib.blake2b()
|
||||||
|
|
||||||
|
if input_type == 1:
|
||||||
|
# Input type is bytes.
|
||||||
|
blake2.update(value_to_hash)
|
||||||
|
else:
|
||||||
|
# Input type is a Path.
|
||||||
|
try:
|
||||||
|
# Catch file errors
|
||||||
|
with value_to_hash.open("rb") as file_to_hash:
|
||||||
|
# Looping allows reading files larger than python's buffer.
|
||||||
|
# Using 2 ^ 16 byte buffer, 64 KiB.
|
||||||
|
while True:
|
||||||
|
data = file_to_hash.read(65536)
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
blake2.update(data)
|
||||||
|
|
||||||
|
# Except file not found and permission errors.
|
||||||
|
except FileNotFoundError as why:
|
||||||
|
raise FileNotFoundError(
|
||||||
|
f"Path specified is not a file or does not exist. Supplied path:"
|
||||||
|
f"{value_to_hash}."
|
||||||
|
) from why
|
||||||
|
except PermissionError as why:
|
||||||
|
raise PermissionError(
|
||||||
|
f"Insufficient permissions to access file at: {value_to_hash}."
|
||||||
|
) from why
|
||||||
|
|
||||||
|
# Return hash in specified format.
|
||||||
|
if output_format == "hex":
|
||||||
|
return blake2.hexdigest()
|
||||||
|
return blake2.digest()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def calculate_file_hash_sha256(file_path: str) -> str:
|
||||||
"""
|
"""
|
||||||
Takes one parameter of file path.
|
Takes one parameter of file path.
|
||||||
It will generate a SHA256 hash for the path and return it.
|
It will generate a SHA256 hash for the path and return it.
|
||||||
|
@ -186,7 +186,7 @@ class ApiFilesUploadHandler(BaseApiHandler):
|
|||||||
file.write(chunk)
|
file.write(chunk)
|
||||||
# We'll check the file hash against the sent hash once the file is
|
# We'll check the file hash against the sent hash once the file is
|
||||||
# written. We cannot check this buffer.
|
# written. We cannot check this buffer.
|
||||||
calculated_hash = self.file_helper.calculate_file_hash(
|
calculated_hash = self.file_helper.calculate_file_hash_sha256(
|
||||||
os.path.join(self.upload_dir, self.filename)
|
os.path.join(self.upload_dir, self.filename)
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
|
Loading…
Reference in New Issue
Block a user