US07-02: Harden API Authorization and Path Boundaries (#84)
This commit was merged in pull request #84.
This commit is contained in:
@@ -129,7 +129,10 @@ class ThumbnailService:
|
||||
raise ThumbnailUnavailable(f"asset {asset_id} has no readable file")
|
||||
source = str(source)
|
||||
if source == asset.current_path:
|
||||
self._validate_path(source) # archive roots lie outside the library
|
||||
# Render the *resolved* path the check approved: revalidating and then
|
||||
# reopening the original name would let a symlink swapped in between
|
||||
# the two steps decide which bytes are served (US07-02).
|
||||
source = str(self._validate_path(source)) # archive roots lie outside
|
||||
|
||||
# Rendering happens outside the DB session (no transaction held during I/O).
|
||||
try:
|
||||
@@ -195,20 +198,16 @@ class ThumbnailService:
|
||||
session.commit()
|
||||
|
||||
# ── path safety ──────────────────────────────────────────────────────────
|
||||
def _validate_path(self, current_path: str) -> None:
|
||||
path = Path(current_path)
|
||||
if path_policy.is_excluded(path):
|
||||
raise PathNotAllowed(f"excluded path: {current_path}")
|
||||
roots = self._config.library_roots
|
||||
if not roots:
|
||||
return
|
||||
for root in roots:
|
||||
try:
|
||||
path_policy.resolve_within(Path(root), path)
|
||||
return
|
||||
except path_policy.PathPolicyError:
|
||||
continue
|
||||
raise PathNotAllowed(f"path outside configured roots: {current_path}")
|
||||
def _validate_path(self, current_path: str) -> Path:
|
||||
"""The resolved path to read, or ``PathNotAllowed``.
|
||||
|
||||
The message names no path: a refusal is returned to the browser, and where
|
||||
the library lives is not the caller's business (US07-02).
|
||||
"""
|
||||
try:
|
||||
return path_policy.resolve_in_roots(self._config.library_roots, current_path)
|
||||
except path_policy.PathPolicyError as error:
|
||||
raise PathNotAllowed(str(error)) from None
|
||||
|
||||
# ── cache key + rendering ──────────────────────────────────────────────────
|
||||
@staticmethod
|
||||
|
||||
Reference in New Issue
Block a user