Harden security controls from REPORT findings
This commit is contained in:
@@ -299,17 +299,24 @@ def extract_text_content(filename: str, data: bytes, mime_type: str) -> Extracti
|
||||
)
|
||||
|
||||
|
||||
def extract_archive_members(data: bytes, depth: int = 0) -> list[ArchiveMember]:
|
||||
"""Extracts processable ZIP members within configured decompression safety budgets."""
|
||||
def extract_archive_members(data: bytes, depth: int = 0, max_members: int | None = None) -> list[ArchiveMember]:
|
||||
"""Extracts processable ZIP members with depth-aware and decompression safety guardrails."""
|
||||
|
||||
members: list[ArchiveMember] = []
|
||||
if depth > settings.max_zip_depth:
|
||||
normalized_depth = max(0, depth)
|
||||
if normalized_depth >= settings.max_zip_depth:
|
||||
return members
|
||||
|
||||
member_limit = settings.max_zip_members
|
||||
if max_members is not None:
|
||||
member_limit = max(0, min(settings.max_zip_members, int(max_members)))
|
||||
if member_limit <= 0:
|
||||
return members
|
||||
|
||||
total_uncompressed_bytes = 0
|
||||
try:
|
||||
with zipfile.ZipFile(io.BytesIO(data)) as archive:
|
||||
infos = [info for info in archive.infolist() if not info.is_dir()][: settings.max_zip_members]
|
||||
infos = [info for info in archive.infolist() if not info.is_dir()][:member_limit]
|
||||
for info in infos:
|
||||
if info.file_size <= 0:
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user