Source code for pyiron_base.utils.safetar
import os
import tarfile
[docs]
def is_within_directory(directory: str, target: str) -> bool:
"""
Check if the target path is within the specified directory.
Args:
directory (str): The directory path.
target (str): The target path.
Returns:
bool: True if the target path is within the directory, False otherwise.
"""
abs_directory = os.path.abspath(directory)
abs_target = os.path.abspath(target)
prefix = os.path.commonprefix([abs_directory, abs_target])
return prefix == abs_directory
[docs]
def safe_extract(
tar: tarfile.TarFile,
path: str = ".",
members: list = None,
*,
numeric_owner: bool = False,
) -> None:
"""
Safely extract the contents of a tar file.
This function checks if the extracted files are within the specified path to prevent path traversal attacks.
Args:
tar (tarfile.TarFile): The tar file object.
path (str, optional): The path to extract the files to. Defaults to ".".
members (list, optional): The members to extract. Defaults to None.
numeric_owner (bool, optional): Whether to use numeric owner for extracted files. Defaults to False.
Raises:
Exception: If attempted path traversal is detected in the tar file.
"""
for member in tar.getmembers():
member_path = os.path.join(path, member.name)
if not is_within_directory(path, member_path):
raise Exception("Attempted Path Traversal in Tar File")
tar.extractall(path, members, numeric_owner=numeric_owner)